我的 JavaScript 对象如下所示:
"ivrItems": {
"50b5e7bec90a6f4e19000001": {
"name": "sdf",
"key": "555",
"onSelect": "fsdfsdfsdf"
},
"50b5e7c3c90a6f4e19000002": {
"name": "dfgdf",
"key": "666",
"onSelect": "fdgdfgdf",
"parentId": null
},
"50b5e7c8c90a6f4e19000003": {
"name": "dfdf",
"key": "55",
"onSelect": "dfdffffffffff",
"parentId": null
}
}
现在我想动态改变对象的顺序。
排序后,对象应如下所示:
"ivrItems": {
"50b5e7bec90a6f4e19000001": {
"name": "sdf",
"key": "555",
"onSelect": "fsdfsdfsdf"
},
"50b5e7c8c90a6f4e19000003": {
"name": "dfdf",
"key": "55",
"onSelect": "dfdffffffffff",
"parentId": null
}
"50b5e7c3c90a6f4e19000002": {
"name": "dfgdf",
"key": "666",
"onSelect": "fdgdfgdf",
"parentId": null
}
}
有什么可行的方法吗?
要获取并更改对象枚举的顺序,您需要手动定义顺序。这通常是通过将对象的属性添加到数组中来完成的。
var keys = Object.keys(data.ivrItems);
现在您可以迭代
keys
数组,并使用键访问 irvItems
对象的成员。
keys.forEach(function(key) {
console.log(data.irvItems[key]);
});
现在的顺序将始终是
Object.keys
给出的顺序,但不能保证该顺序就是您想要的。
您可以使用该数组并使用您需要的任何顺序对其重新排序。
keys.sort(function(a, b) {
return +data.irvItems[a].key - +data.irvItems[b].key;
});
此排序将按数字转换后每个对象的嵌套
key
属性对键进行排序。
你应该使用数组。对象键没有顺序
像这样:
{
"ivrItems": [
{
"id": "50b5e7bec90a6f4e19000001",
"name": "sdf",
"key": "555",
"onSelect": "fsdfsdfsdf"
},
{
"id": "50b5e7c8c90a6f4e19000003",
"name": "dfdf",
"key": "55",
"onSelect": "dfdffffffffff",
"parentId": null
},
{
"id": "50b5e7c3c90a6f4e19000002",
"name": "dfgdf",
"key": "666",
"onSelect": "fdgdfgdf",
"parentId": null
}
]
}
如果您在浏览器中执行此操作,您可能会在跨浏览器兼容性方面遇到困难。但计算机大多是确定性的,因此您可能可以在一个 JavaScript 引擎实现中可靠地完成这一任务。例如,在 Chrome REPL/控制台中,您只需按顺序添加属性即可获得此顺序:
var n = {}
n.b = 2
n.c = 3
var m = {}
m.c = 3
m.b = 2
JSON.stringify(n)
> "{"b":2,"c":3}"
JSON.stringify(m)
> "{"c":3,"b":2}"
因此您可以重建您的对象,按照您想要稍后找到它们的顺序添加键。
但是其他人是对的,如果你想要真正的、可预测的顺序,你应该使用数组。
Javascript 对象本质上是无序的。
你不能这样做。
虽然不建议这样做,因为 JavaScript 标准没有定义对象属性的顺序,但实际上,属性是按添加时间按时间顺序排序的。您可以像这样创建对象的排序副本:
const sorted = Object.fromEntries(Object.entries(object).sort((a, b) => a[1].key - b[1].key));