20

我有这个数组:

var arr1 = ['a1', 'a2', 'a3', 'a4', 'a5'];

我需要将它向右移动 2 个位置,例如

arr1 = ['a4', 'a5', 'a1', 'a2', 'a3']; 

这适用于左移:

arr1 = arr1.concat(arr1.splice(0,2)); // shift left by 2

我得到:

arr1 = ['a3', 'a4', 'a5', 'a1', 'a2']; 

但是我不知道怎么做右移...

4

3 回答 3

21

向右移动到N位置 == 向左移动到array.length - N位置。

因此,要为您的阵列向右移动 2 个位置 - 只需将其向左移动 3 个位置。

一旦你已经有了另一个功能,就没有理由去实现另一个功能。加上shift/unshift/pop循环中的解决方案几乎不会像splice + concat

于 2013-04-19T04:38:25.517 回答
21

您可以使用.pop()获取最后一项并将.unshift()其放在前面:

function shiftArrayToRight(arr, places) {
    for (var i = 0; i < places; i++) {
        arr.unshift(arr.pop());
    }
}
于 2013-04-19T04:38:42.097 回答
11

使用.concat()您正在构建一个新数组,并替换旧数组。这样做的问题是,如果您对 Array 有其他引用,它们将不会被更新,因此它们仍将保留未移位的版本。

要进行右移并实际改变现有数组,您可以这样做:

arr1.unshift.apply(arr1, arr1.splice(3,2));

unshift()方法是可变参数的,.apply允许您传递存储在类似数组的集合中的多个参数。

因此,.splice()通过删除最后两个并返回它们来.unshift()改变数组,并通过将返回的添加.splice()到开头来改变数组。


左移将被重写,类似于右移,因为.push()它也是可变参数:

arr1.push.apply(arr1, arr1.splice(0,2));
于 2013-04-19T05:14:43.353 回答