我们如何自定义排序 JavaScript 对象键?

How can we custom sort JavaScript object keys?

我正在尝试对 JavaScript 对象进行自定义排序,但无法了解如何以正确的方式执行此操作。假设我有一个像

这样的对象
var test = {
  'yellow': [],
  'green': [],
  'red': [],
  'blue': []
}

我有一个数组,其值为:var arr = ['red', 'green', 'blue', 'yellow'];

所以排序后,我想按照数组中指定的顺序输出,比如

var test = {
  'red': [],
  'green': [],
  'blue': [],
  'yellow': []
}

但出于某种原因,我无法实现。我在这里尝试做的是循环和排序,但它按 A-Z 模式排序,而不是按照我在其中指定数组的顺序排序。此外,您可能会问我什至没有在排序函数中使用我的数组,但我没有得到实现这一目标的确切方法。

var test = {
  'yellow': [],
  'green': [],
  'red': [],
  'blue': []
}

var keys = Object.keys(test);

console.log(keys.sort());  //["blue", "green", "red", "yellow"] which is not ordered nor it's an object

任何指示都会对他有所帮助。


注意:我有这个特定要求,因为我使用带默认 {{#each}} 块的 HandleBars,但我想按该顺序循环内部对象。我可以在 Handlebars 中循环对象并将它们传递给模板,但我没有使用模板引擎的强大功能。我想让 Handlebars 循环它们,还是我遗漏了什么?如果我循环对象并将整个标记传递给 handlebars 模板可以吗?

JavaScript 对象是散列,因此本质上是无序的。您不能以任何给定顺序创建具有属性的对象。如果您在枚举键时收到订单,那纯属巧合,或者更准确地说,是 JavaScript 引擎的实现细节。

您必须使用对象数组来实现您想要做的事情。

换句话说,您选择的数据结构是不可能的。

你可以使用 Map()

A Map object iterates its elements in insertion order

var arr = ['red', 'green', 'blue', 'yellow'];

var map = new Map();

arr.forEach(function(val, index) {
  var obj = {};
  obj[val] = [];
  map.set(index, obj)
});

console.log(map)

也许你可以使用 JSON.stringify()

来改变它

喜欢

var json = {     "name": "David",     "age" : 78,     "NoOfVisits" : 4   };
console.log(json);
//outputs - Object {name: "David", age: 78, NoOfVisits: 4}
//change order to NoOfVisits,age,name

var k = JSON.parse(JSON.stringify( json, ["NoOfVisits","age","name"] , 4));
console.log(k);
//outputs - Object {NoOfVisits: 4, age: 78, name: "David"} 

将您想要的键顺序放入数组中并提供给函数。然后将结果解析回 json.