【问题标题】:sort javascript array in object, maintaining key对对象中的javascript数组进行排序,维护键
【发布时间】:2012-04-09 23:40:17
【问题描述】:

我有一个带有两个数组的 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});

为了排名,但名字并没有留下来。

感谢所有帮助。谢谢!

【问题讨论】:

  • 最好更改您的对象以保存不同格式的数据,并且 Object 是一个错误的变量名。
  • 我的对象没有被命名为对象..我只是认为它会更简单......猜不......

标签: javascript sorting


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我知道必须有一种更直观的方法来解决这个问题。
  • 所以。正如你所展示的,我有我的人反对。 [{name:val}, {name:val}],但我正在努力提醒 (people.name[0]) 和我的 var,虽然创建时使用了函数外,并且使用 async:false POST,但可以不能在代码之外使用...有什么想法吗?
  • 那实际上是people[0].name。
【解决方案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);
});

【讨论】:

  • forEach 很好。这是 Mozilla 扩展还是跨浏览器?
  • ForEach 在大多数浏览器中都可用,并且可以在旧浏览器中回退。
  • 感谢莫森!我最喜欢你的 forEach 方法来重新配置当前对象
【解决方案3】:

嗯,是的,如果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;    
});

【讨论】:

  • 太棒了!看起来很结实。我试试看!
  • 在这种情况下,不确定制作特殊的 Person 对象是否比通用对象有任何优势。我想以后你可能想在上面做instanceof?
  • @darkporter 嗯,这很难从一个 sn-p 代码中分辨出来,不是吗?也许一个特殊的 Person 对象会派上用场以提供更多功能,也许根本不会......
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 2021-10-30
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2013-12-03
    相关资源
    最近更新 更多