Сдвинуть массив вперед в javascript

Итак, я не знаю, правильное название или нет, но то, что я изо всех сил пытаюсь сделать, это найти алгоритм, чтобы сделать что-то подобное. Итак, у нас есть входной массив, такой как: ['a','b', 'c', 'd', ...] до конца алфавита, и число для сдвига. Я должен вывести массив, например ['x', 'y', 'z', 'a', 'b', 'c', ...], если у меня есть число 3 для сдвига; Любые идеи о том, как это сделать? Я старался:

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);
}

person Ivelin Dinev    schedule 17.01.2017    source источник


Ответы (5)


Это почти все, за исключением того, что печатает [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 раз в цикле.

person Patrick Murphy    schedule 17.01.2017
comment
Разве это не должно быть поп и unshift? - person A.Sharma; 18.01.2017
comment
сделай arr.unshift(arr.pop()); вместо этого - person dtkaias; 18.01.2017

Вам нужны следующие инструменты: .slice ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice ) и .concat ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat ).

function getShiftedArray (arr, n) {
    var i = arr.length - n;
    var front = arr.slice(0, i);
    var back = arr.slice(i);
    return back.concat(front);
}
person Luke    schedule 17.01.2017

Вот решение, которое копирует результат в новый массив. Сложность времени и пространства равна O(arr.length), если вы ищете решение, которое изменяет массив на месте и имеет временную сложность O(x), см. ответ Патрика.

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

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

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

person Tamas Hegedus    schedule 17.01.2017

Изобретение 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>

person Redu    schedule 18.01.2017

Просто разделите массив на 2 части и потом объедините их. Вот и все!

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);
person Sascha    schedule 17.01.2017