如何在Javascript中将数组向上移动4个位置

22

如何在 JavaScript 中将数组向上移动 4 个位置?

我有以下字符串数组:

var array1 = ["t0","t1","t2","t3","t4","t5"];
我需要一个将 "array1" 转换成以下结果的函数:
// Note how "t0" moves to the fourth position for example
var array2 = ["t3","t4","t5","t0","t1","t2"];  

提前感谢。


7
这是旋转,而非移动。 - Peter
2
+1 Peter,因为我认为这是一个需要精确(使用正确的单词)的情况。在JavaScript的上下文中,Array.shift()已经定义了移动数组的含义。话虽如此,这里有一个用于旋转数组的JS函数。https://dev59.com/o3I-5IYBdhLWcg3wKVE9#1985471 - Walter Stabosz
5个回答

35
array1 = array1.concat(array1.splice(0,3));

在Firebug中运行以下代码以进行验证

var array1 = ["t0","t1","t2","t3","t4","t5"];
console.log(array1);
array1 = array1.concat(array1.splice(0,3));
console.log(array1);

得到的结果为

["t0", "t1", "t2", "t3", "t4", "t5"]
["t3", "t4", "t5", "t0", "t1", "t2"]

2
作为一个函数 - function reorderArray(arr, startIndex, howMany) { return arr.concat(arr.splice(startIndex,howMany)); } 需要进行错误检查 :) - Russ Cam
1
请注意,Array.concat()会使用源数组中的元素创建一个全新的数组。对于小数组来说无关紧要,但需要考虑这一点。 - Walter Stabosz

19
你可以 slice 数组,然后以相反的顺序 join 它:
var array2 = array1.slice(3).concat(array1.slice(0, 3));

2
如果你经常需要这样做,并且需要用不同的量进行移位,那么你可以将其放入一个函数中,并传入一个变量来代替其中的3。(我有些犹豫地使用“移位”这个词,因为这也是Javascript数组方法。) - Nathan Long
是的,这是我最喜欢的答案,很好! - Eric Bishard
1
这很棒,因为它不会修改array1。 - tjklemz

4
function shiftArray(theArray, times) {
    // roll over when longer than length
    times = times % theArray.length;
    var newArray = theArray.slice(times);
    newArray = newArray.concat(theArray.slice(0, times));
    return newArray;
}

var array1 = ["t0","t1","t2","t3","t4","t5"];
var array2 = shiftArray(array1, 3);
alert(array2); // ["t3","t4","t5","t0","t1","t2"]

2
另一种方法是这样的:

var array2 = array1.slice(0);

for (var i = 0; i < 3; i++) {
    array2.push(array2.shift());
}

0

另一种方法是将以下代码粘贴到大型Firebug控制台中以确认其有效性:

var a = [0, 1, 2, 3, 4, 5];
for (var i = 0; i < 3; i++) {
    a.unshift(a.pop());
}
// the next line is to show it in the Firebug console; variable "a" holds the array
a.toString(",");

@Nathan:最终结果一个数组,保存在变量“a”中;将其作为字符串输出的那一行仅用于说明目的,这就是为什么它没有被分配给任何东西(它直接进入Firebug控制台)。我会更正我的答案,以便清楚地表明我指的是Firebug控制台……有时我会忘记它不是内置浏览器的一部分。;-) - NickFitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接