javascript - 数组排序和值同时变化
问题描述
我在下面有一个数组,每个数组中的第一个数字表示顺序。我想要做的是,每当我更改顺序时,它都会使用数组并将其重新索引为 2、3、4、5。
const payments = [
[2, paymentName1, '5%'],
[3, paymentName2, '5%'],
[4, paymentName3, '5%'],
[5, paymentName4, '5%']
];
例如,如果我将第一个数组顺序从 2 更改为 6,则数组变为下面的数组。
const payments = [
[2, paymentName2, '5%'],
[3, paymentName3, '5%'],
[4, paymentName4, '5%'],
[5, paymentName1, '5%'],
];
我目前所做的是对其进行排序并使用 for 循环对其进行重新排序。如果可能的话,我想在一个循环中完成。请帮我写这个算法。
提前致谢!
编辑:
payments.sort((a, b) => a[0] - b[0]);
for (const index in payments) {
payments[index][0] = parseInt(index) + 2;
}
这是我目前的功能。会有更好的方法吗?谢谢!
解决方案
排序后,只需遍历数组并逐步分配新的订单值。这里没有“更好”。
const payments = [
[2, "paymentName1", '5%'],
[3, "paymentName2", '5%'],
[4, "paymentName3", '5%'],
[5, "paymentName4", '5%']
];
function setOrder(index, newOrder) {
payments[index][0] = newOrder;
payments.sort(([a], [b]) => a - b);
for (let i = 0; i < payments.length; i++) payments[i][0] = i + 2;
}
setOrder(0, 6);
console.log(payments);
时间复杂度由调用决定sort
:O(nlogn)。
或者,您可以使用二进制搜索来找到变异元素应该去的目标索引,然后相应地旋转数组元素。那么时间复杂度将是O(n)。尽管这具有更好的时间复杂度,但 JavaScript 代码的开销将使对于中等大小的数组,您将获得更快的结果sort
。