我有一个带有两个数组的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});
订购排名,但名称不会随之而来。
所有帮助表示赞赏。谢谢!
答案 0 :(得分: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]});
}
答案 1 :(得分: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);
});
答案 2 :(得分:1)
嗯,是的,如果names
数组中的第i个对象连接到rank
数组中的第i个对象,则应该用这种方式表示。这意味着,您应该使用具有两个属性的Person
(或其他任何对象)对象:name
和rank
。
// 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;
});
答案 3 :(得分:0)
您必须编写自己的排序函数,对于每个排序操作,记住在排列数组中每次迭代的哪个索引。在names数组中从源索引到目标索引执行相同的操作。 (编辑)从我头顶开始的一个算法就是起泡,查看它。
另一种选择是寻找某种“地图”集合实现。