Сдвиг массива вправо на 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']; 


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

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

    Ничего не найдено.