小编典典

将数组元素从一个数组位置移动到另一个位置

all

我很难弄清楚如何移动数组的元素。例如,给定以下内容:

var array = [ 'a', 'b', 'c', 'd', 'e'];

如何编写函数将元素移动'd'到左侧'b'

还是'a'在右边'c'

移动元素后,应更新其余元素的索引。结果数组将是:

array = ['a', 'd', 'b', 'c', 'e']

这似乎应该很简单,但我无法理解它。


阅读 147

收藏
2022-03-03

共1个答案

小编典典

如果您想要 npm 上的版本,array-move是最接近这个答案的,尽管它不是相同的实现。有关更多详细信息,请参阅其用法部分。可以在 npm
array.prototype.move上找到此答案的先前版本(修改后的
Array.prototype.move) 。


我在这个功能上取得了相当大的成功:

function array_move(arr, old_index, new_index) {

    if (new_index >= arr.length) {

        var k = new_index - arr.length + 1;

        while (k--) {

            arr.push(undefined);

        }

    }

    arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);

    return arr; // for testing

};



// returns [2, 1, 3]

console.log(array_move([1, 2, 3], 0, 1));

请注意,最后一个return仅用于测试目的:splice就地对数组执行操作,因此不需要返回。通过扩展,这move是一个就地操作。如果您想避免这种情况并返回副本,请使用slice.

单步执行代码:

  1. 如果new_index大于数组的长度,我们希望(我假设)用 new undefineds 正确填充数组。这个小片段通过推动undefined数组来处理这个问题,直到我们有适当的长度。
  2. 然后,在 中arr.splice(old_index, 1)[0],我们拼接出旧元素。splice返回拼接出来的元素,但它在一个数组中。在我们上面的例子中,这是[1]. 所以我们采用该数组的第一个索引来获取原始1数据。
  3. 然后我们使用splice将这个元素插入到 new_index 的位置。由于我们在 if 上面填充了数组new_index > arr.length,它可能会出现在正确的位置,除非他们做了一些奇怪的事情,比如传入一个负数。

一个更好的版本来解释负指数:

function array_move(arr, old_index, new_index) {

    while (old_index < 0) {

        old_index += arr.length;

    }

    while (new_index < 0) {

        new_index += arr.length;

    }

    if (new_index >= arr.length) {

        var k = new_index - arr.length + 1;

        while (k--) {

            arr.push(undefined);

        }

    }

    arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);

    return arr; // for testing purposes

};



// returns [1, 3, 2]

console.log(array_move([1, 2, 3], -1, -2));

array_move([1, 2, 3], -1, -2)这应该适当地考虑(将最后一个元素移到倒数第二个位置)之类的事情。结果应该是[1, 3, 2]

无论哪种方式,在您最初的问题中,您都会array_move(arr, 0, 2)aafter做c。对于d以前b,你会这样做array_move(arr, 3, 1)

2022-03-03