[英]Sort a JavaScript object by key or value; ES6
在我问之前; 关于这个特定主题有很多讨论,其中大部分与 ES5 有关,不一定适用于 ES6。 我试图得到一些澄清,也许可以帮助正在搜索 inte.net 的下一个人寻找答案。 这是专门针对 ES6 的。
考虑以下 object 结构:
const unsorted_object = {
'C': '0003',
'D': '0004',
'A': '0001',
'B': '0002',
'F': '0005',
};
如何按键对 JavaScript object 进行排序? (在这里回答)
const sorted_object = {}; Object.keys(unsorted_object).sort().forEach(function(key) { sorted_object[key] = unsorted_object[key]; });
如何按键值对 JavaScript object 进行排序?
关于问题 #2,我可能不是很清楚。 思路是按照键的值对 JavaScript object 进行排序,而不是键和值。
const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
Output:
'0001': '13.1666' '0004': '13.1666' '0002': '11.0001' '0003': '10.6664' '0005': '7.3331'
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()
而不是传播:
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);
提取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);
您可以对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)
一种更清洁的方法是
Object.entries(unsorted_object)
.sort()
.reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {});
这基于排序的元组构建了一个空的 object
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.