按值对对象属性进行排序

新手上路,请多包涵

如果我有一个 JavaScript 对象,例如:

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

有没有办法根据价值对属性进行排序?所以我最终得到

list = {
  "bar": 15,
  "me": 75,
  "you": 100,
  "foo": 116
};

原文由 Steerpike 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 606
2 个回答

将它们移动到一个数组中,对该数组进行排序,然后将该数组用于您的目的。这是一个解决方案:

 let maxSpeed = {
 car: 300,
 bike: 60,
 motorbike: 200,
 airplane: 1000,
 helicopter: 400,
 rocket: 8 * 60 * 60
 };
 let sortable = [];
 for (var vehicle in maxSpeed) {
 sortable.push([vehicle, maxSpeed[vehicle]]);
 }

 sortable.sort(function(a, b) {
 return a[1] - b[1];
 });

 // [["bike", 60], ["motorbike", 200], ["car", 300],
 // ["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]


一旦你有了数组,你可以按照你喜欢的顺序从数组中重建对象,从而完全实现你的目标。这适用于我所知道的所有浏览器,但它取决于实现的怪癖,并且可能随时中断。你永远不应该对 JavaScript 对象中元素的顺序做出假设。

 let objSorted = {}
 sortable.forEach(function(item){
 objSorted[item[0]]=item[1]
 })


在 ES8 中,您可以使用 Object.entries() 将对象转换为数组:

 const maxSpeed = {
 car: 300,
 bike: 60,
 motorbike: 200,
 airplane: 1000,
 helicopter: 400,
 rocket: 8 * 60 * 60
 };

 const sortable = Object.entries(maxSpeed)
 .sort(([,a],[,b]) => ab)
 .reduce((r, [k, v]) => ({ ...r, [k]: v }), {});

 console.log(sortable);

在 ES10 中,您可以使用 Object.fromEntries() 将数组转换为对象。那么代码可以简化为:

 const maxSpeed = {
 car: 300,
 bike: 60,
 motorbike: 200,
 airplane: 1000,
 helicopter: 400,
 rocket: 8 * 60 * 60
 };

 const sortable = Object.fromEntries(
 Object.entries(maxSpeed).sort(([,a],[,b]) => ab)
 );

 console.log(sortable);

原文由 Nosredna 发布,翻译遵循 CC BY-SA 4.0 许可协议

我们不想复制整个数据结构,也不想在需要关联数组的地方使用数组。

这是与 bonna 做同样事情的另一种方法:

 var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]})
console.log(keysSorted);     // bar,me,you,foo

原文由 Markus R 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题