【问题标题】:Sorting JavaScript Object by property value (Numeric Key)按属性值(数字键)对 JavaScript 对象进行排序
【发布时间】:2019-12-03 19:29:51
【问题描述】:

按住!在标记为重复或否决之前

假设我有一个如下的 java Script 对象,我想按值对这个对象进行排序,是的,我知道数组是为它发明的,并且内置了 sort,但由于某种原因,我必须使用这个对象 :(

var myObj = {"you": 100, "me": 75,"11111": 20, "foo": 116, "bar": 15};

到现在为止,我还是结束了

{11111: 20, bar: 15, me: 75, you: 100, foo: 116}

但你可以看到这不是你想要的,因为在这种情况下,我尝试了这个被剥夺的解决方案中的许多解决方案,代码如下所示

Object
 .keys(myObj)
 .sort((a, b) => myObj[a]-myObj[b])
 .reduce((_sortedObj, key) => ({
   ..._sortedObj, 
   [key]: myObj[key]
 }), {}) 

编辑我看到这个 question 已经不是我的情况了,因为我有数值所以没有任何一个答案对我有帮助

【问题讨论】:

标签: javascript sorting object properties


【解决方案1】:

这是不可能的。

在 ES2015+ 中,the traversal order 的对象属性为:

  • 首先,键是整数索引,按数字升序排列。
  • 然后是所有其他字符串键,按照它们添加到对象的顺序。
  • 最后是所有符号键,按照它们添加到对象的顺序。

即使你在末尾添加了11111 键,当你使用Object.keys()for...in 循环时,它总是会被首先获取

const obj = {};
obj["first"] = 1
obj["second"] = 2
obj["200"] = 200 // integer keys
obj["100"] = 100 

// 100 and 200 property will be moved to the top even if they are added in the end
// 200 was added before 100, but it will be printed after 100 
// because integer indices are traversed in ascending numeric order
console.log(obj) 

// 100 will be the first key
console.log(Object.keys(obj))

您可以改用 Map 对象。它具有键值对,并记住键的原始插入顺序。

【讨论】:

  • 所以不可能?也不能用任何最丑陋的解决方案
  • @AbdulHameed 不,你不能这样做。依赖属性排序(即使它现在是定义明确的行为)是一个非常糟糕的主意,因为它对对象“生命历史”做出了相当广泛的假设。这是许多可怕错误的秘诀。
【解决方案2】:

不知道这个答案是否对你有帮助:

Sort a dictionary by value in JavaScript

在你的字典上运行该答案中的代码后,我得到了这个:

这是你可以使用的东西吗?

【讨论】:

  • 我认为现在看起来不可能,那么我可能会选择这个解决方案,至少在那种情况下我现在可以显示正确的结果
最近更新 更多