【问题标题】:Javascript: Sorting Objects (not arrays) in descendingJavascript:以降序对对象(不是数组)进行排序
【发布时间】:2019-07-11 20:22:46
【问题描述】:

我知道对象默认按升序或我们将插入的方式排序,但我需要按降序对对象进行排序的最佳方式。例如:

Input x = {
  a: {},
  b: {},
  c: {},
  d: {}
}

Output: x = {
  d: {},
  c: {},
  b: {},
  a: {}
}

我尝试了以下解决方案,它有效,但这是一个好习惯还是我可以在这方面做得更好?

x= Object.keys(x).sort().reverse().reduce((obj, key) => {
    obj[key] = x[key]
    return obj
}, {})

【问题讨论】:

  • 对象属性没有保证的顺序,就像数组元素一样。
  • 也许先对它们进行排序:Object.keys(x).sort((a, b) => b.localeCompare(a)).reduce()
  • 您无法可靠地对没有保证顺序的东西进行排序。如果需要对数组进行排序,请使用数组!
  • @James — 从 ECMAScript 2017 开始,请参阅抽象操作 OrdinaryOwnPropertyKeys,它在访问属性名称时被各种方法使用。但是,并非所有使用中的实现都符合要求。
  • @James 这不再是真的。 Javascript 对象 do 有保证的顺序,假设您的键名不是正整数值。我绝不会建议将对象用于任何依赖于顺序的事物,但是“对象属性没有保证顺序”的概念是错误的信息。

标签: javascript sorting object


【解决方案1】:

您可以使用 Array.sort 方法。 我相信这只会在第一级深度上排序

 const list = 
 { 
   a: "4",
   c: "2",
   b: "3",
   d: "1"
 }
 const sortedList = {};
 Object.keys(list).sort().reverse().forEach(function(key) {
  sortedList[key] = list[key];
 });

【讨论】:

  • 查看上面对 zer00ne 回答的评论。
【解决方案2】:

使用 Map 来保证顺序,同时使用 Object.entries() 方法来保留键/值对。

  • Object.entries()获取数组数组
  • .reverse()
  • 将其转换为地图(Map() 保证顺序根据输入方式)
  • 在 Map 上使用 Object.fromEntries() 返回一个对象。

let obj = {a:{}, b:{}, c:{}, d:{}};
let rev = new Map(Object.entries(obj).reverse());
let ent = Object.fromEntries(rev);
console.log(ent);

Object.fromEntries()compatibility table

【讨论】:

  • 您一般不能强制执行特定排序。自 ECMAScript 2017 起,顺序是按数字升序排列的正整数键,然后按插入顺序排列不是符号的字符串,然后按插入顺序排列符号。所以你不能按降序排列整数键,也不能混合整数、字符串和符号。抽象操作OrdinaryOwnPropertyKeys 被所有获取密钥的东西使用。
  • 我认为 Object.entries() 返回 [[key, value], [ley, value],...] 在这种情况下键变成了一个字符串。 Map() 接受任何内容作为插入顺序中的键。哦,那.sort() 没用了?会更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多