【问题标题】:Sorting only one property inside an array based on another property根据另一个属性仅对数组中的一个属性进行排序
【发布时间】:2014-04-11 00:40:41
【问题描述】:

我有一个 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 数组副本,而且看起来不太正确。必须有一个更优雅的解决方案。

感谢您的帮助。

【问题讨论】:

    标签: javascript sorting


    【解决方案1】:

    我遇到了一个看起来很糟糕的解决方案,它涉及 2 个额外的 deepCloned 数组副本

    数组的浅拷贝就足够了:

    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
    

    【讨论】:

    • 谢谢,您的优雅解决方案正是我召唤 SO 帮助的原因。
    【解决方案2】:

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

    array.sort(function(a1, a2) {
      return a1.id - a2.id;
    });
    
    array.forEach(function(v, i) {
      v.sortedPosition = i;
    });
    

    edit如果你只想设置排序位置,你可以这样做:

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

    这会创建一个新数组,其中包含对原始数组中对象的引用,然后对其进行排序,然后修复位置属性。原始数组的顺序不受影响。制作新数组的通行证不会很昂贵;它根本不是真正的“深拷贝”。

    【讨论】:

    • 但这件事是我不希望对数组进行排序。只想更新sortedPosition
    • 我更新了相关对象的顺序以避免这种混淆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2019-06-11
    • 2017-02-23
    相关资源
    最近更新 更多