首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按键或值对JavaScript对象进行排序;ES6

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

Stack Overflow用户
提问于 2019-03-23 22:46:55
回答 4查看 10.7K关注 0票数 3

在我问之前,有很多关于这个特定主题的讨论,其中大部分是关于ES5的,不一定对ES6来说是正确的。我试图得到一些澄清,也许可以帮助下一个在互联网上搜索答案的人。--这是指ES6,特别是

问题:

考虑以下对象结构:

代码语言:javascript
复制
const unsorted_object = {
    'C': '0003',
    'D': '0004',
    'A': '0001',
    'B': '0002',
    'F': '0005',
}; 
  1. 如何按键对JavaScript对象进行排序?(回答这里) Object.keys(unsorted_object).sort().forEach(function(key) { sorted_objectkey = unsorted_objectkey;};
  2. 如何根据键值对JavaScript对象进行排序?

编辑#1

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

编辑#2

代码语言:javascript
复制
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‘

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-23 22:53:32

ES6中的对象键具有遍历顺序。整数键始终是第一位的,并按升序排序(0 -> 9)。在非整数键中,赋值顺序保持不变(请参阅此文章)。要对对象的键进行排序,我们需要重新创建对象,并按所需的顺序添加键。

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

若要排序和重新创建对象,请执行以下操作:

  • 使用Object.entries()获取键/值对的数组- [[key, value], [key, value]]
  • 根据值(对中的第二项)对它们进行排序,使用数组破坏 - [, v1]。使用+运算符将字符串转换为数字,
  • Reduce返回到对象。使用析构[k , v]获取键和值,并使用计算属性名 - ({ [k]: v })对象传播 - ({ ...r, [k]: v })将它们添加到累加器对象中。

代码语言:javascript
复制
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()从条目创建对象

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);

票数 7
EN

Stack Overflow用户

发布于 2019-03-23 22:49:35

提取entries而不是keys,然后根据每个值的差异提取sort

代码语言:javascript
复制
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从数组构造对象可能更合适:

代码语言:javascript
复制
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);

票数 4
EN

Stack Overflow用户

发布于 2019-03-23 22:52:35

您可以对entries进行排序,并使用reduce()创建新对象。

话虽如此,您的应用程序设计可能有问题,甚至需要做这样的操作。

代码语言:javascript
复制
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)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55319092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档