在JavaScript中将数组向前移动

3

好的,我不知道标题是否正确,但我正在努力寻找一种算法来做类似于这样的事情。我们有一个输入数组,例如:['a','b','c','d',...] 直到字母表的末尾,以及一个要移位的数字。如果我有一个数字3进行移位,我必须像这样输出数组:['x','y','z','a','b','c',...];你有什么想法吗?我尝试过:

function solve(args)
{
    let arr = ['a', 'b', 'c', 'd'];
    let number = 3;

    for (let i = 0; i < arr.length; i++)
    {
        if (typeof arr[i + 1] === undefined)
        {
            arr[0] = arr[i];
        }
        else if (typeof arr[i - 1] === undefined)
        {
            arr[arr.length - 1] = arr[0];
        }
        else
        {
            arr[i] = arr[i + 1];
        }
    }
    console.log(arr);
}

可能是如何在JavaScript中以循环方式访问数组的重复问题。 - rlemon
这是将数组进行旋转,而不是移位。 - David Conrad
5个回答

6

除了它打印[d,e,f ... a,b,c]之外,这几乎就是它了。

for(var i = 0; i < number; i++){
   arr.push(arr.shift());
}

正如评论中所指出的那样(感谢@dtkaias),请执行以下操作:结果为[x,y,z,a,b,c...]
for(var i = 0; i < number; i++){
   arr.unshift(arr.pop());
}

unshift函数可以在数组的开头添加一个元素,而pop函数则会移除最后一个元素,所以在循环中,它会将最后一个元素移动到开头number次。


应该是pop和unshift吧? - A.Sharma
3
请使用arr.unshift(arr.pop());代替。 - dtkaias

4

1
这里有一个解决方案,它将结果复制到一个新数组中。时间和空间复杂度为 O(arr.length),如果你正在寻找一种能够原地修改数组且具有 O(x) 时间复杂度的解决方案,请参考 Patrick 的答案。

function rotate(arr, x) {
  return arr.slice(x).concat(arr.slice(0, x));
}

let arr = "abcdefghijkl".split("");

console.log(rotate(arr, -3).join(""));


1

使用Array.prototye.rotate()的发明可能对这项工作很有用。让我们看一个简单的实现。

Array.prototype.rotate = function(n) {
                           var len = this.length;
                           return !(n % len) ? this.slice()
                                             : this.map((e,i,a) => a[(i + (len + n % len)) % len]);
                         };

var   alpha = Array(26).fill().map((_,i) => String.fromCharCode(i+97)),
 rotateLeft = e => (alpha = alpha.rotate(1), alphabet.textContent = alpha.join(",")),
rotateRight = e => (alpha = alpha.rotate(-1), alphabet.textContent = alpha.join(","));

alphabet.textContent = alpha.join(",");
buttonLeft.addEventListener("click",rotateLeft);
buttonRight.addEventListener("click",rotateRight);
<div id="alphabet"></div>
<button id="buttonLeft"><<</button>
<button id="buttonRight">>></button>


0
只需将数组分成两部分,然后将它们连接起来即可。就这样!
arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
number = 3;

xxx = arr.slice(-number);
yyy = arr.slice(0,arr.length - number);
arr_shift = xxx.concat(yyy);

console.log(arr_shift);

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