我有一个对象数组,其键名为order,如下所示:
[{id:"24fin1st",ruler:false,order:1}, {id:"24fin2nd",ruler:false,order:2}, {id:"24fin3rd",ruler:false,order:3}, {id:"24fin4th",ruler:false,order:4}]
假设我们将项目4移至项目2。或第1项到第4项。更新整个关键订单列表的最有效方法是什么。我在想从原点到目的地获取整个数组,然后在该范围内对键进行重新编号,例如:
var switchUp = [{
id: "24fin1st",
ruler: false,
order: 1
}, {
id: "24fin2nd",
ruler: false,
order: 2
}, {
id: "24fin3rd",
ruler: false,
order: 3
}, {
id: "24fin4th",
ruler: false,
order: 4
}];
function sortNumber(a, b) {
return a - b;
}
function resort(org, des, arr) {
var move;
if (org > des) {
move = "up";
var range = arr.slice(des - 1, org)
} else {
move = "down";
var range = arr.slice(org - 1, des)
}
range.forEach(function(su, i) {
if (su.order === org) {
su.order = des;
} else {
if (move === "up") {
su.order = su.order + 1;
} else {
su.order = su.order - 1
}
}
})
}
resort(1, 3, switchUp);
switchUp.sort(function(a, b) {
return parseFloat(a.order) - parseFloat(b.order);
});
console.log(switchUp)
我认为这种方式很不错,但是不确定是否最快。
该sort
应用在结束-你交换两个节点的订单价值后-可能需要O(nlogn)的时间,而这可能在做O(n)的两个调用splice
和重编循环:
var switchUp = [{
id: "24fin1st",
ruler: false,
order: 1
}, {
id: "24fin2nd",
ruler: false,
order: 2
}, {
id: "24fin3rd",
ruler: false,
order: 3
}, {
id: "24fin4th",
ruler: false,
order: 4
}];
function resort(org, des, arr) {
var first = Math.min(org, des) - 1,
last = Math.max(org, des) - 1;
arr.splice(des-1,0,arr.splice(org-1, 1)[0]);
for (var i = first; i <= last; i++) {
arr[i].order = i + 1;
}
}
resort(3, 1, switchUp);
console.log(switchUp);
请注意,这splice
将更改突变点之后所有元素的索引,并且在第二次调用时再次发生这种情况,这将恢复真正需要更改的范围右侧的元素的原始索引。尽管splice
可能非常有效地执行其任务(因为它是一种内部方法),但显式地逐个移动范围内的元素可能会更有效(在非常大的数组上):
var switchUp = [{
id: "24fin1st",
ruler: false,
order: 1
}, {
id: "24fin2nd",
ruler: false,
order: 2
}, {
id: "24fin3rd",
ruler: false,
order: 3
}, {
id: "24fin4th",
ruler: false,
order: 4
}];
function resort(org, des, arr) {
var node = arr[org-1],
inc = org < des ? 1 : -1;
for (var i = org-1; i !== des-1; i+=inc) {
arr[i] = arr[i+inc];
arr[i].order = i + 1;
}
node.order = des;
arr[des-1] = node;
}
resort(3, 1, switchUp);
console.log(switchUp);
最后要注意的是:您的函数期望索引基于1,就像order
值一样。但是,由于JavaScript使用基于0的索引,因此对于使用您的代码的人来说,这可能会很直观。在标准数组函数slice
希望将基于0的索引作为参数的情况下,此自定义函数希望使用基于1的索引。如果您重新考虑此选择并使用基于0的索引,那将是一件好事。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句