Если вы хотите версию на npm, array-move является наиболее близким к этому ответу, хотя это не та же реализация.Смотрите его использование раздел для более подробной информации.Предыдущая версия этого ответа (которая изменила Array.prototype.move) может быть найдена на npm в array.prototype.move .
. У меня был довольно хороший успех с этой функцией:
function array_move(arr, old_index, new_index) {
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr; // for testing
};
// returns [2, 1, 3]
console.log(array_move([1, 2, 3], 0, 1));
Обратите внимание, что последний return
просто для целей тестирования: splice
выполняет операции с массивом на месте, поэтому возвратне обязательно.Таким образом, move
является операцией на месте.Если вы хотите избежать этого и вернуть копию, используйте slice
.
Пошаговый код:
- Если
new_index
больше, чемдлина массива, мы хотим (я полагаю) правильно заполнить массив новыми undefined
с.Этот небольшой фрагмент обрабатывает это, нажимая undefined
на массив, пока мы не получим нужную длину. - Затем, в
arr.splice(old_index, 1)[0]
, мы склеиваем старый элемент.splice
возвращает элемент, который был вставлен, но он находится в массиве.В нашем примере выше это было [1]
.Итак, мы берем первый индекс этого массива, чтобы получить туда 1
. - Затем мы используем
splice
, чтобы вставить этот элемент вместо new_index.Поскольку мы добавили массив выше, если new_index > arr.length
, он, вероятно, появится в нужном месте, если они не сделали что-то странное, например, передают отрицательное число.
Более интересная версия для учета отрицательных показателей:
function array_move(arr, old_index, new_index) {
while (old_index < 0) {
old_index += arr.length;
}
while (new_index < 0) {
new_index += arr.length;
}
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr; // for testing purposes
};
// returns [1, 3, 2]
console.log(array_move([1, 2, 3], -1, -2));
Что должно правильно учитывать такие вещи, как array_move([1, 2, 3], -1, -2)
(переместите последний элемент со второго на последнее место).Результат для этого должен быть [1, 3, 2]
.
В любом случае, в исходном вопросе вы бы сделали array_move(arr, 0, 2)
для a
после c
.Для d
до b
вы должны сделать array_move(arr, 3, 1)
.