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

时间:2016-05-05 17:03:30

标签: javascript sorting handlebars.js javascript-objects

我正在尝试自定义JavaScript对象的排序,但却无法以正确的方式获取我们如何做到这一点。假设我有一个像

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

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

的数组

因此在排序之后,我想按照数组中指定的顺序输出,如

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

但由于某种原因,我无法做到这一点。我在这里尝试做的是循环和排序,但它在AZ模式中排序,而不是按照我指定数组的顺序排序。另外,你可能会问,我甚至没有在sort函数中使用我的数组但是没有得到一个确切的方法来实现这一点。

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循环它们还是我错过了什么?如果我循环对象并将整个标记传递给把手模板,那没关系。

3 个答案:

答案 0 :(得分:3)

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

你必须使用一系列对象来实现你想做的事情。

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

答案 1 :(得分:2)

您可以使用Map()

  

Map对象按插入顺序迭代其元素



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)




答案 2 :(得分:0)

也许您可以使用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。