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

art*_*son 0 javascript sorting object ecmascript-6

在我问之前 关于这个特定主题有很多讨论,其中大多数与ES5有关,并不一定对ES6成立。我正在尝试澄清一些问题,也许可以帮助下一个正在互联网上寻找答案的人。具体参考ES6

问题:

考虑以下对象结构:

const unsorted_object = {
    'C': '0003',
    'D': '0004',
    'A': '0001',
    'B': '0002',
    'F': '0005',
}; 
Run Code Online (Sandbox Code Playgroud)
  1. 如何按键对JavaScript对象排序?(在这里回答)

    const sorted_object = {};
    Object.keys(unsorted_object).sort().forEach(function(key) {
        sorted_object[key] = unsorted_object[key];
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如何按键值对JavaScript对象排序?

编辑#1

我可能对问题2不太清楚。这个想法是根据键的值而不是键和值对JavaScript对象进行排序。

编辑#2

const unsorted_object = {
    '0001': '13.1666',
    '0002': '11.0001',
    '0003': '10.6664',
    '0004': '13.1666',
    '0005': '7.3331',
};
Run Code Online (Sandbox Code Playgroud)

输出:

'0001': '13.1666'
'0004': '13.1666'
'0002': '11.0001'
'0003': '10.6664'
'0005': '7.3331'
Run Code Online (Sandbox Code Playgroud)

Ori*_*ori 5

ES6中的对象键具有遍历顺序。整数键始终是第一个,并且按升序排序(0-> 9)。在非整数键中,分配的顺序得以保留(请参阅本文)。要对对象的键进行排序,我们需要重新创建对象,并按要求的顺序添加键。

注意:这意味着排序将仅对非整数键起作用,因为它们始终为1,并且始终以升序排序。

排序并重新创建对象:

  • 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);
Run Code Online (Sandbox Code Playgroud)

边缘友好版本,使用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);
Run Code Online (Sandbox Code Playgroud)