2013-04-19 5 views
7

У меня есть этот массив:Сдвиг массива вправо на JavaScript

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']; 

Но я не знаю, как это сделать сдвиг вправо ...

ответ

15

сдвиг вправо на N позиции == сдвиг влево на array.length - N позиции.

Итак, чтобы сдвинуть вправо на 2 позиции для вас массив - просто сдвиньте его налево на 3 позиции.

Нет причин для реализации другой функции, как только у вас ее уже есть. Плюс решения с shift/unshift/pop в цикле едва будет столь же эффективным, как splice + concat

+0

Любые комментарии по downvote? – zerkms

+0

+1. Умнее моего ответа – gilly3

+1

хороший ответ +1. – Vinay

8

Вы можете использовать .pop() получить последний элемент и .unshift() поставить его на фронте:

function shiftArrayToRight(arr, places) { 
    for (var i = 0; i < places; i++) { 
     arr.unshift(arr.pop()); 
    } 
} 
5

Использование .concat() вы строите новый массив и замену старого. Проблема в том, что если у вас есть другие ссылки на Array, они не будут обновляться, поэтому они все равно сохранят неперемещенную версию.

Чтобы сделать сдвиг вправо, а на самом деле мутировать существующий массив, вы можете сделать это:

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

Метод unshift() является VARIADIC и .apply позволяет передать несколько аргументов, хранящихся в Array- подобный коллекция.

Так что .splice() мутирует массив, удаляя последние два и возвращая их, и .unshift() мутирует массив, добавляя те, которые были возвращены .splice() в начало.


Левый сдвиг будет переписан похож на сдвиг вправо, так как .push() также VARIADIC:

arr1.push.apply(arr1, arr1.splice(0,2));