我有这个数组:
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'];
但我不知道怎么做右移...
答案 0 :(得分:16)
向右移至N
位置==向左移至array.length - N
个位置。
所以要在你阵列的2个位置右转 - 只需将它向左移动3个位置。
没有理由在您拥有其他功能后立即执行。在循环中使用shift/unshift/pop
的解决方案几乎不会像splice + concat
答案 1 :(得分:11)
您可以使用.pop()
获取最后一项,.unshift()
将其放在前面:
function shiftArrayToRight(arr, places) {
for (var i = 0; i < places; i++) {
arr.unshift(arr.pop());
}
}
答案 2 :(得分:6)
使用.concat()
您正在构建一个新阵列,并替换旧阵列。问题在于,如果你有对数组的其他引用,它们将不会被更新,因此它们仍将保留未移位的版本。
要进行右移,并实际改变现有阵列,您可以这样做:
arr1.unshift.apply(arr1, arr1.splice(3,2));
unshift()
方法是可变参数,.apply
允许您传递存储在类似数组的集合中的多个参数。
因此.splice()
通过删除最后两个并且返回它们来改变数组,并且.unshift()
通过将.splice()
返回的数据添加到开头来改变数组。
左移将被重写,类似于右移,因为.push()
也是可变的:
arr1.push.apply(arr1, arr1.splice(0,2));