我有一个Javascript数组有2个属性id
,sortedPosition
。
我希望基于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数组副本,而且看起来不对。必须有一个更优雅的解决方案。
感谢您的帮助。
答案 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; });
它创建一个新数组,引用原始数组中的对象,然后对其进行排序,然后修复位置属性。原始数组的顺序不受影响。制作新阵列的通行证不会非常昂贵;它根本不是一个“深刻的副本”。