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

时间:2019-03-23 22:46:56

标签: javascript sorting object ecmascript-6

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

问题:

请考虑以下对象结构:

const unsorted_object = {
    'C': '0003',
    'D': '0004',
    'A': '0001',
    'B': '0002',
    'F': '0005',
}; 
  1. 如何按键对JavaScript对象进行排序? (已回答here

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

编辑#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'

3 个答案:

答案 0 :(得分:3)

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

注意:这意味着排序仅适用于非整数键,因为它们始终为1,并且始终按升序进行排序。

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

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);