我对this主题的上一篇文章有类似的需求:需要在不丢失密钥的情况下对对象进行排序和排序。但是,我有一个对象的对象:
var o = {
123: { field: "science", name: "zed" },
234: { field: "tech", name: "sara" },
672: { field: "arts", name: "jon" }
}
_.fromPairs(_.sortBy(_.toPairs(o),function(a){ return a[1] }).reverse())
上面使用了lodash解决方案提到的另一个主题 - 但是我没有得到任何结果的一致性(保留密钥!)
任何帮助都将不胜感激。
答案 0 :(得分:1)
我不清楚你打算在上面对什么价值进行排序,因为对象是无法比拟的。假设您希望按名称字段对它们进行排序 - 但您会发现它仍无效。
首先是一些背景:
历史上,对象属性在ES中被认为是无序的。密钥的枚举顺序(例如for ... in
或Object.keys()
)是特定于实现的。
但是,枚举顺序成为ES2015中的指定行为。
该枚举顺序编纂了大多数引擎已经在做的事情:
如果需要将整数用作有序键,则需要使用不同的数据结构。 Map
是恰当的:
const o = {
123: { field: "science", name: "zed" },
234: { field: "tech", name: "sara" },
672: { field: "arts", name: "jon" }
}
const { compare } = new Intl.Collator();
const res = new Map(Object
.entries(o)
.sort(([ , a ], [ , b ]) => compare(a.name, b.name))
);
console.log([ ...res ]);
如果您需要担心旧的IE,一组键值条目也足够了。