在我问之前,有很多关于这个特定主题的讨论,其中大部分是关于ES5的,不一定对ES6来说是正确的。我试图得到一些澄清,也许可以帮助下一个在互联网上搜索答案的人。--这是指ES6,特别是。
问题:
考虑以下对象结构:
const unsorted_object = {
'C': '0003',
'D': '0004',
'A': '0001',
'B': '0002',
'F': '0005',
}; 编辑#1
对于问题2,我可能还不太清楚,其想法是根据键的值而不是键和值对JavaScript对象进行排序。
编辑#2
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‘
发布于 2019-03-23 22:53:32
ES6中的对象键具有遍历顺序。整数键始终是第一位的,并按升序排序(0 -> 9)。在非整数键中,赋值顺序保持不变(请参阅此文章)。要对对象的键进行排序,我们需要重新创建对象,并按所需的顺序添加键。
注:--这意味着排序只适用于非整数键,因为整数总是第一位,并且总是按升序排序。
若要排序和重新创建对象,请执行以下操作:
Object.entries()获取键/值对的数组- [[key, value], [key, value]][, v1]。使用+运算符将字符串转换为数字,[k , v]获取键和值,并使用计算属性名 - ({ [k]: v })和对象传播 - ({ ...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.fromEntries()而不是Array.reduce()从条目创建对象
const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
const sorted_object = Object.fromEntries(
Object.entries(unsorted_object)
.sort(([,v1], [,v2]) => +v2 - +v1)
);
console.log(sorted_object);
边缘友好版本,它使用Object.assign()而不是spread:
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);
发布于 2019-03-23 22:49:35
提取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);
发布于 2019-03-23 22:52:35
您可以对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)
https://stackoverflow.com/questions/55319092
复制相似问题