-2

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

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 非常重要!

4

3 回答 3

5

您可以使用对象数组:

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]};

然后您可以id对该数组进行排序:

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

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


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

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];
    ...
}
于 2012-07-24T12:08:18.053 回答
2

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

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

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

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

如果您愿意,请在 chrome 中编写以下内容

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

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

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

于 2012-07-24T12:02:02.627 回答
-1

您是否尝试过使用 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);​
​
于 2012-07-24T12:04:03.800 回答