在我问之前;关于这个特定主题有很多讨论,其中大多数与ES5有关,并不一定对ES6成立。我正在尝试澄清一些问题,也许可以帮助下一个正在互联网上寻找答案的人。 这是专门针对ES6的参考。
请考虑以下对象结构:
const unsorted_object = {
'C': '0003',
'D': '0004',
'A': '0001',
'B': '0002',
'F': '0005',
};
如何按键对JavaScript对象进行排序? (已回答here)
const sorted_object = {};
Object.keys(unsorted_object).sort().forEach(function(key) {
sorted_object[key] = unsorted_object[key];
});
如何按键值对JavaScript对象进行排序?
我可能对问题2并不十分清楚。这个想法是根据键的值而不是键和值对JavaScript对象进行排序。
const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
输出:
'0001': '13.1666' '0004': '13.1666' '0002': '11.0001' '0003': '10.6664' '0005': '7.3331'
答案 0 :(得分:3)
ES6中的对象键具有遍历顺序。整数键始终是第一个,并且按升序排序(0-> 9)。在非整数键中,分配顺序得以保留(请参见此article)。要对对象的键进行排序,我们需要重新创建对象,并按要求的顺序添加键。
注意:这意味着排序仅适用于非整数键,因为它们始终为1,并且始终按升序进行排序。
要对对象进行排序和重新创建:
Object.entries()
获取数组-[[key, value], [key, value]]
[, v1]
。使用+
运算符将字符串转换为数字,[k , v]
获取键和值,然后使用computed property names-({ [k]: v })
和object spread-({ ...r, [k]: v })
const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
const sorted_object = Object.entries(unsorted_object)
.sort(([,v1], [,v2]) => +v2 - +v1)
.reduce((r, [k, v]) => ({ ...r, [k]: v }), {});
console.log(sorted_object);
边缘友好版本,使用Object.assign()
而不是传播:
const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
const sorted_object = Object.entries(unsorted_object)
.sort(([,v1], [,v2]) => +v2 - +v1)
.reduce((r, [k, v]) => Object.assign(r, { [k]: v }), {});
console.log(sorted_object);
答案 1 :(得分:2)
您可以对entries
进行排序,并使用reduce()
创建新对象。
话虽如此,您的应用程序设计中可能甚至需要执行这样的操作错误
const unsorted_object = {
'C': '0003',
'D': '0004',
'A': '0001',
'B': '0002',
'F': '0005',
};
const sorted = Object.entries(unsorted_object)
.sort((a, b) => a[1] - b[1])
.reduce((a, c) => (a[c[0]] = c[1], a), {})
console.log(sorted)
答案 2 :(得分:1)
先提取entries
而不是keys
,然后再提取sort
,方法是各值的差:
const unsorted_object = {
'C': '0003',
'D': '0004',
'A': '0001',
'B': '0002',
'F': '0005',
};
const sorted_object = {};
Object.entries(unsorted_object)
.sort((a, b) => a[1] - b[1])
.forEach(([key, val]) => {
sorted_object[key] = val;
});
console.log(sorted_object);
请注意,使用reduce
从数组构造对象可能更合适:
const unsorted_object = {
'C': '0003',
'D': '0004',
'A': '0001',
'B': '0002',
'F': '0005',
};
const sorted_object = Object.entries(unsorted_object)
.sort((a, b) => a[1] - b[1])
.reduce((a, [key, val]) => {
a[key] = val;
return a;
}, {});
console.log(sorted_object);