【问题标题】:How to sort object values in JavaScript when keys are numbers?当键是数字时,如何在 JavaScript 中对对象值进行排序?
【发布时间】:2012-07-24 11:38:56
【问题描述】:

假设我有这样奇怪的代码:

var weirdo = {};
var ids = [10, 30, 11, 1, 4, 2];
var producers = ['Ford','Rover','BMW','Fiat','Renault','Mitsubishi'];
var n = producers.length;
for(var i=0; i<n; i++) {
    weirdo[ids[i]] = producers[i];
}
// unknown code ???

如何按值对怪人进行排序?这不是数组,不,我无法在填充怪人之前对生产者进行排序。

有什么想法吗?

哦,关系 id producer 非常重要!

【问题讨论】:

  • 您无法对对象属性进行排序。如果你想要一个特定的顺序,你必须使用一个数组。我想知道为什么你需要weirdo 作为一个对象,如果你有数字键的话。为什么不直接创建producers 的副本?
  • 为什么不先对数组进行排序,然后将排序后的数组放入对象中
  • 直截了当,但必须有任何方法可以做到这一点 - 例如,如果我在这个 write for( in ) 循环之后不想这样做?
  • @marverix:如果你能提供更多关于你想要做什么(整体问题/场景)的信息,你想用weirdo做什么,为什么(你认为)它必须是一个对象等,那么我们可以更好地帮助你。否则答案是你做不到。

标签: javascript arrays sorting object


【解决方案1】:

您可以使用对象数组:

var items = [
  {id:10, producer:'Ford'},
  {id:30, producer:'Rover'},
  {id:11, producer:'BMW'},
  {id:1, producer:'Fiat'},
  {id:4, producer:'Renault'},
  {id:2, producer:'Mitsubishi'},
]

// or, starting from your two arrays:
var items = [];
for (var i=0; i<ids.length && i<producers.length; i++)
    items[i] = {id:ids[i], producer:producers[i]};

那你可以sort那个数组byid:

items.sort(function(a, b){ return a.id-b.id; });

...并使用 for 循环对其进行迭代。


另一种解决方案是迭代器数组,以正确的顺序循环遍历 id生产者对象 (weirdo):

var weirdo = {"10":"Ford","30":"Rover",...};
var ids = Object.keys(weirdo); // if not already built somewhere

ids.sort(function(a,b){return a-b;}); // sort numeric
// loop:
for (var i=0; i<ids.length; i++) {
    var id=ids[i], producer=weirdo[id];
    ...
}

【讨论】:

【解决方案2】:

简短的回答是对象是按规范无序的。一个对象的属性就是——属性。它们按您的要求提供,它们不是要在对象内移动的项目。

在检查时如何可视化对象完全取决于执行可视化的代理。例如,如果您要在 Chrome 中编写以下代码

console.log({ x: 1, a: 2 });

...它将按字母顺序显示参数。这不是对象与生俱来的东西,而只是 chrome 实现的问题。

如果您愿意,请在 chrome 中编写以下代码

for(key in { x: 1, a: 2 }) console.log(key);

...它将记录一个x,后跟一个a,即按添加顺序显示同一对象的属性。

您当然可以确保将属性按其各自属性名称的字母/数字顺序添加到对象中,但这会忽略重点,因为不能保证所有实现都会保留添加任何一个。

【讨论】:

  • @maverix:你确实问过这个问题。
  • 谢谢,我不知道这也是实现的问题...:/
  • @maverix:是的,这样的数组可以排序,就像 Bergi 建议的那样。
  • @marverix:如果您解释了您的实际问题并要求解决方案,而不是要求您的解决方案的解决方案,这可能会容易得多。如果你只是问如何对属性进行排序,答案是“你不能”,并且试图坚持下去不会让你有任何收获。
【解决方案3】:

您是否尝试过使用 Array.Sort?

http://jsfiddle.net/gRoberts/mXwdN/

var weirdo = {};
var producers = ['Ford','Rover','BMW','Fiat','Renault','Mitsubishi'];
producers.sort();
console.log(producers);
producers.map(function(item, index) {
    this[index] = item;
}, weirdo);
console.log(weirdo);

编辑:由于我正在研究解决方案时问题正在更新,请根据更新的问题查找更新版本:

http://jsfiddle.net/gRoberts/mXwdN/1/

var weirdo = {};
var ids = [10, 30, 11, 1, 4, 2];
var producers = ['Ford','Rover','BMW','Fiat','Renault','Mitsubishi'];
ids.sort();
ids.map(function(item, index) {
    weirdo[item] = producers[index];
}, weirdo);
console.log(weirdo);​
​

【讨论】:

  • 这个问题在我做样本的时候被编辑了!!
  • @maverix:你可以做一些礼仪。请记住,人们是来帮助的,并且没有任何义务这样做。
  • 对不起...我只是生气,因为当我写我不能...时第 10 个人写了“排序之前”...:/
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2019-12-03
  • 2018-03-06
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多