我们如何自定义排序 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.
我正在尝试对 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.