5

我有一个带有两个数组的 javascript 对象,如图所示,

var Object = {'name': [Matt, Tom, Mike...], 'rank': [34,1,17...]};

我正在尝试按排名 1、2、3.. 排序,但保持名称与排名相关联。

Object.name[0] // tom
Object.rank[0] // tom's rank of 1.

我应该重新配置我的对象以使排序更容易吗?

我目前正在使用

 Object.rank.sort(function(a,b){return a-b});

排序排名,但名称并没有留下来。

所有帮助表示赞赏。谢谢!

4

4 回答 4

4

是的,重新配置。假设你有这个:

var people = [{name:"Matt", rank:34}, {name:"Tom", rank:1}, {name:"Mike", rank:17}];

然后你可以这样排序:

people.sort(function(a, b) {
  return a.rank - b.rank;
}

编辑

由于您有并行列表,因此只需将它们压缩在一起:

var people = [];
for (var i = 0; i < Object.name.length; i++) {
  people.push({name:Object.name[i], rank:Object.rank[i]});
}
于 2012-04-09T23:47:34.057 回答
2

真实世界对象:

 o = {name: ['Matt', 'Tom', 'Mike'], rank: [34,1,17]};

制作一个数组以获得更好的数据结构:

var arr =[]; 
o.name.forEach(function(name, i){
      arr.push({name: name, rank: o.rank[i]})
});

按等级排序:

arr.sort(function(a,b){return a.rank - b.rank});

按名称分类:

arr.sort(function(a,b){return a.name- b.name});

恢复到原始数据结构:

o = {name:[], rank:[]}
arr.forEach(function(item){
   o.name.push(item.name);
   o.rank.push(item.rank);
});
于 2012-04-09T23:49:42.383 回答
1

好吧,是的,如果数组中的第 i 个对象names连接到数组中的第 i 个对象,则rank应该以这种方式表示它。这意味着,您应该使用Person具有两个属性的(或任何它是)对象:namerank.

// person constructor
function Person(name, rank) {
    this.name = name;
    this.rank = rank;
}

// create the object with the array
var myObject = {
    myArray: new Array()
};

// populate the array
myObject.myArray.push(new Person('Matt', 34));
myObject.myArray.push(new Person('Tom', 1));
myObject.myArray.push(new Person('Mike', 17));

// sort the Person objects according to their ranks
myObject.myArray.sort(function(a, b) {
    return b.rank - a.rank;    
});
于 2012-04-09T23:46:57.257 回答
0

您必须编写自己的排序函数,对于每个排序操作,记住每次迭代在 ranks 数组中的哪个索引。在名称数组中从源索引到目标索引执行相同的移动。(编辑)我想到的一个算法是冒泡排序,查一下。

另一种选择是寻找某种“地图”集合实现。

于 2012-04-09T23:45:41.200 回答