使用排序数组对对象键进行排序

时间:2018-09-06 12:12:16

标签: javascript arrays object lodash

我有下面的代码按字母顺序对对象进行排序,我想摆脱字母顺序并按自己选择的顺序进行排序。

var obj = {
  c: "see",
  a: "ay",
  b: "bee",
  d: "dee"
};

console.log("Object order:");
var key, keys = [];
for (key in obj) {
  keys.push(key);
}
console.log(keys.map(function(key) { return key + ": " + obj[key];}).join(", "));

console.log("Sorted order:");
keys = Object.keys(obj).sort()
console.log(keys.map(function(key) { return key + ": " + obj[key];}).join(", "));

上面的代码将输出a,b,c,d的对象顺序-但是可以说我希望数组具有自己的顺序,例如

var sortedArray = ['b','c','d','a'];

那么我怎么知道在我的sortedArray中实现这个.sort呢?

预期结果:

var newObj = {
  b: "bee",
  c: "cee",
  d: "dee",
  a: "ay"
};

谢谢

5 个答案:

答案 0 :(得分:1)

您可以将自定义排序功能传递到sort() API中。请参见下面的示例:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];
    
// sort by value
items.sort(function (a, b) {
  return a.value - b.value;
});

// sort by name
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // ignore upper and lowercase
  var nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // names must be equal
  return 0;
});

console.log(items)

答案 1 :(得分:1)

这是一种非常奇怪的模式,但是,根据需要,我创建了一个名为CustomOrderBy的函数,该函数将根据键数组进行排序。

类似这样的东西:

  1. 您已经有了一个数组,该数组具有要从头到尾排序的键,就像您已经拥有(sortedArray)一样。然后,将此数组传递给函数。

  2. 然后,该函数循环遍历obj键并获取其第一个字母,以检查其是否与键的arra匹配,并获取其索引。根据索引进行排序。

  3. 排序后,它会创建一个新的obj,并按照之前使用的sort函数中创建的顺序设置键和值

请,请参阅代码以更好地理解它。

var sortedArray = ['b', 'c', 'd', 'a'];

var obj = {
  c: "see",
  a: "ay",
  b: "bee",
  d: "dee"
};

function CustomOrderBy(keyOrder){
  let keysSorted = Object.keys(obj).sort(function(keyA, keyB) {
    let idxA = keyOrder.indexOf(keyA[0]);  
    let idxB = keyOrder.indexOf(keyB[0]);
    if (idxA > idxB){
      return 1
    }else if(idxA < idxB){
      return -1
    }else{
      return 0;
    }  
  });

  let sorted = {};
  for (var key of keysSorted){
    if (obj[key] != null){
      sorted[key] = obj[key];
    }
  }
  return sorted;
}
console.log(CustomOrderBy(sortedArray))

答案 2 :(得分:0)

使用使用indexOf()

的自定义分类器

var sortedArray = ['b', 'c', 'd', 'a'];

var obj = {
  c: "see",
  a: "ay",
  b: "bee",
  d: "dee"
};


var keys = Object.keys(obj).sort(function(a, b) {
  // TODO - cases where not in sortedArray
  return sortedArray.indexOf(a) - sortedArray.indexOf(b)
});


console.log(keys)

答案 3 :(得分:0)

请问我,但是排序顺序和对象之间的关系是否一对一,为什么我们不做这样的事情(从排序顺序数组开始):

var myObject = {c: "see", a: "ay", b: "bee", d: "dee"};
var sortOrder = ['b','c','d','a'];

const mySort = (obj, order) => order.reduce((r,c) => (r[c] = obj[c], r), {})

console.log(mySort(myObject, sortOrder))

由于它仅使用一个reduce,因此看起来会更加简洁和简单。

答案 4 :(得分:-1)

您可以像下面一样创建一个函数。并传递您的对象,它将返回排序后的对象给您。

    var obj = {
        c: "see",
        a: "ay",
        b: "bee",
        d: "dee"
    };


    function sortObject(obj)
    {
        var keys = [];
        var outputObj = {};

        for (key in obj)
        {
            keys.push(key);
        }

        keys.sort();

        for(var i=0; i<keys.length; i++){
            outputObj[keys[i]] = obj[keys[i]];
        }

        return outputObj;
    }
    
    console.log(sortObject(obj));