Сдвиг массива вправо на JavaScript [дубликат]
На этот вопрос уже есть ответ здесь:
JavaScript Array rotate ()
17 ответов
У меня есть такой массив:
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'];
Но я не знаю, как правильно сделать сдвиг...
3 ответов:
Сдвиг в право
Nпозиции == сдвиг влево доarray.length - Nпозиции.Итак, чтобы сдвинуть вправо на 2 позиции для вашего массива-просто сдвиньте его влево на 3 позиции.
Нет никакой причины реализовывать другую функцию, как только она у вас уже есть. Плюс решения с
shift/unshift/popв цикле едва ли будут столь же эффективны, какsplice + concat
Вы можете использовать
.pop(), чтобы получить последний элемент и.unshift()поместить его в начало:function shiftArrayToRight(arr, places) { for (var i = 0; i < places; i++) { arr.unshift(arr.pop()); } }
Используя
.concat(), вы создаете новый массив и заменяете старый. Проблема в том, что если у вас есть другие ссылки на массив, они не будут обновлены, поэтому они по-прежнему будут содержать несмещенную версию.Чтобы сделать правый сдвиг и фактически мутировать существующий массив, вы можете сделать следующее:
arr1.unshift.apply(arr1, arr1.splice(3,2));
Метод
unshift()является вариадическим, и.applyпозволяет передавать несколько аргументов, хранящихся в Массивоподобной коллекции.Таким образом,
.splice()изменяет массив путем удаления последние два, и возвращая их, и.unshift()мутирует массив, добавляя те, возвращенные.splice()в начало.
Левый сдвиг будет переписан аналогично правому сдвигу, так как
.push()также является вариадическим:arr1.push.apply(arr1, arr1.splice(0,2));
Comments