例如以下
var data = {
'States': ['NSW', 'VIC'],
'Countries': ['GBR', 'AUS'],
'Capitals': ['SYD', 'MEL']
}
for (var item in data) {
console.log(item);
}
印刷
States
Countries
Capitals
有没有办法按字母顺序排序以便打印
Capitals
Countries
States
例如以下
var data = {
'States': ['NSW', 'VIC'],
'Countries': ['GBR', 'AUS'],
'Capitals': ['SYD', 'MEL']
}
for (var item in data) {
console.log(item);
}
印刷
States
Countries
Capitals
有没有办法按字母顺序排序以便打印
Capitals
Countries
States
不在对象本身内:对象的属性集合是无序的。
您可以做的一件事是使用Object.keys()
,并对数组进行排序,然后对其进行迭代。
Object.keys(data)
.sort()
.forEach(function(v, i) {
console.log(v, data[v]);
});
不支持 ECMAScript 第 5 版的浏览器的补丁(实现):
这是一个很好的功能解决方案:
基本上,
Object.keys
sort
按键ES5解决方案:
not_sorted = {b: false, a: true};
sorted = Object.keys(not_sorted)
.sort()
.reduce(function (acc, key) {
acc[key] = not_sorted[key];
return acc;
}, {});
console.log(sorted) //{a: true, b: false}
ES6 解决方案:
not_sorted = {b: false, a: true}
sorted = Object.keys(not_sorted)
.sort()
.reduce((acc, key) => ({
...acc, [key]: not_sorted[key]
}), {})
console.log(sorted) //{a: true, b: false}
就在这里。不在 ECMAScript 标准范围内,但支持跨浏览器和 Node.js,并且显然稳定。请参阅https://stackoverflow.com/a/23202095/645715。
编辑:这将返回一个键被排序的对象。您可以使用Object.keys(...)
从对象中获取有序键。
为什么要担心对象键顺序?差异在某些应用程序中可能很重要,例如使用xml2js解析 XML,它将XML 表示为嵌套对象,并使用 XML 标签作为哈希键。
有几个注意事项:
Object.keys(obj)
for (var key in obj) {...}
在 Safari、Firefox 中可能有所不同该函数返回一个对象,其中包含按字母顺序插入的排序键:
function orderKeys(obj, expected) {
var keys = Object.keys(obj).sort(function keyOrder(k1, k2) {
if (k1 < k2) return -1;
else if (k1 > k2) return +1;
else return 0;
});
var i, after = {};
for (i = 0; i < keys.length; i++) {
after[keys[i]] = obj[keys[i]];
delete obj[keys[i]];
}
for (i = 0; i < keys.length; i++) {
obj[keys[i]] = after[keys[i]];
}
return obj;
}
这是一个快速测试:
var example = {
"3": "charlie",
"p:style": "c",
"berries": "e",
"p:nvSpPr": "a",
"p:txBody": "d",
"apples": "e",
"5": "eagle",
"p:spPr": "b"
}
var obj = orderKeys(example);
这返回
{ '3': 'charlie',
'5': 'eagle',
apples: 'e',
berries: 'e',
'p:nvSpPr': 'a',
'p:spPr': 'b',
'p:style': 'c',
'p:txBody': 'd' }
然后,您可以按以下方式获取订购的密钥:
Object.keys(obj)
哪个返回
["3", "5", "apples", "berries", "p:nvSpPr", "p:spPr", "p:style", "p:txBody"]
您也可以通过这种方式对其进行排序。
const data = {
States: ['NSW', 'VIC'],
Countries: ['GBR', 'AUS'],
Capitals: ['SYD', 'MEL']
}
const sortedObject = Object.fromEntries(Object.entries(data).sort())
我无法详细解释它为什么有效,但显然它完美无缺:) 如果您不相信我,请尝试自己:D
请注意,您的浏览器或 Node.js 版本应支持 Object.fromEntries
对于浏览器兼容性检查此页面底部
对于 Node,它适用于 12 及更高版本。对于来自 v1.1 的 Deno。
_.chain(obj).toPairs().sortBy(0).fromPairs().value()
使用您的示例数据:
var data = {
'States': ['NSW', 'VIC'],
'Countries': ['GBR', 'AUS'],
'Capitals': ['SYD', 'MEL']
}
data = _.chain(data)
.toPairs() // turn the object into an array of [key, value] pairs
.sortBy(0) // sort these pairs by index [0] which is [key]
.fromPairs() // convert array of pairs back into an object {key: value}
.value() // return value
/*
{
Capitals: [ 'SYD', 'MEL' ],
Countries: [ 'GBR', 'AUS' ],
States: [ 'NSW', 'VIC' ]
}
*/