繁体   English   中英

按键或值对 JavaScript object 进行排序; ES6

[英]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',
}; 
  1. 如何按键对 JavaScript object 进行排序? 在这里回答)

     const sorted_object = {}; Object.keys(unsorted_object).sort().forEach(function(key) { sorted_object[key] = unsorted_object[key]; });
  2. 如何按键值对 JavaScript object 进行排序?

编辑#1

关于问题 #2,我可能不是很清楚。 思路是按照键的值对 JavaScript object 进行排序,而不是键和值。

编辑#2

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) 排序。 在非整数键中,保留分配顺序(请参阅本文)。 要对对象的键进行排序,我们需要重新创建对象,并按所需顺序添加键。

注意:这意味着排序仅适用于非整数键,因为整数总是第一,并且总是按升序排序。

要对对象进行排序和重新创建:

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM