基于另一个属性仅对数组内的一个属性进行排序

时间:2014-04-11 00:40:41

标签: javascript sorting

我有一个Javascript数组有2个属性idsortedPosition

我希望基于id对数组进行假排序,并修改sortedPosition,以便它反映该数组中对象的排序位置。

例如:

输入数组:

[
    {
        "id" : 34,
        "sortedPosition" : 2
    }, {
        "id" : 3,
        "sortedPosition" : 1
    }, {

        "id" : 344,
        "sortedPosition" : 0
    }
]

输出数组:

[
    {
        "id" : 34,
        "sortedPosition" : 1
    }, {
        "id" : 3,
        "sortedPosition" : 0
    }, {
        "id" : 344,
        "sortedPosition" : 2
    }
]

我遇到了一个看起来很糟糕的解决方案,它涉及2个额外的deepCloned数组副本,而且看起来不对。必须有一个更优雅的解决方案。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

  

我遇到了一个看起来非常糟糕的解决方案,它涉及2个额外的深度克隆数组副本

数组的浅表副本应该足够了:

arr.slice() // create new array with the same objects
 .sort(function(a,b){return a.id-b.id;}) // sort that (leave original untouched)
 .forEach(function(o,i){o.sortedPosition = i;}); // update the objects

答案 1 :(得分:0)

对数组进行排序,然后更新位置。

array.sort(function(a1, a2) {
  return a1.id - a2.id;
});

array.forEach(function(v, i) {
  v.sortedPosition = i;
});

编辑如果您只想设置排序位置,可以执行以下操作:

var t = array.map(function(v) {
  return { v: v }
});
t.sort(function(v1, v2) { return v1.v.id - v2.v.id; });
t.forEach(function(v, i) { v.v.sortedPosition = i; });

它创建一个新数组,引用原始数组中的对象,然后对其进行排序,然后修复位置属性。原始数组的顺序不受影响。制作新阵列的通行证不会非常昂贵;它根本不是一个“深刻的副本”。