Переупорядочивающие массивы
Скажем, у меня есть массив, который выглядит так:
var playlist = [
{artist:"Herbie Hancock", title:"Thrust"},
{artist:"Lalo Schifrin", title:"Shifting Gears"},
{artist:"Faze-O", title:"Riding High"}
];
Как переместить элемент в другую позицию?
Я хочу переместить, например, {artist:"Lalo Schifrin", title:"Shifting Gears"}
до конца.
Я попытался использовать сращивание, например:
var tmp = playlist.splice(2,1);
playlist.splice(2,0,tmp);
Но это не сработает.
Ответы
Ответ 1
Синтаксис Array.splice
:
yourArray.splice(index, howmany, element1, /*.....,*/ elementX);
Где:
- index - это позиция в массиве, с которой вы хотите начать удаление элементов из
- howmany - сколько элементов вы хотите удалить из индекса
- element1,..., elementX - это элементы, которые вы хотите вставить из индекса позиции.
Это означает, что splice()
можно использовать для удаления элементов, добавления элементов или замены элементов в массиве в зависимости от передаваемых вами аргументов.
Обратите внимание, что он возвращает массив удаленных элементов.
Что-то приятное и общее:
Array.prototype.move = function (from, to) {
this.splice(to, 0, this.splice(from, 1)[0]);
};
Затем просто используйте:
var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5
Диаграмма:
![Диаграмма алгоритмов]()
Ответ 2
Если вы знаете индексы, вы можете легко поменять элементы, используя простую функцию:
function swapElement(array, indexA, indexB) {
var tmp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = tmp;
}
swapElement(playlist, 1, 2);
// [{"artist":"Herbie Hancock","title":"Thrust"},
// {"artist":"Faze-O","title":"Riding High"},
// {"artist":"Lalo Schifrin","title":"Shifting Gears"}]
Индексы массива - это просто свойства объекта массива, поэтому вы можете менять его значения.
Ответ 3
Вот неизменная версия для тех, кто интересуется:
function immutableMove(arr, from, to) {
return arr.reduce((prev, current, idx, self) => {
if (from === to) {
prev.push(current);
}
if (idx === from) {
return prev;
}
if (from < to) {
prev.push(current);
}
if (idx === to) {
prev.push(self[from]);
}
if (from > to) {
prev.push(current);
}
return prev;
}, []);
}
Ответ 4
Измените 2 на 1 как первый параметр в вызове сплайсинга при удалении элемента:
var tmp = playlist.splice(1,1);
playlist.splice(2,0,tmp);
Ответ 5
Вы всегда можете использовать метод сортировки, если вы не знаете, где находится запись:
playlist.sort(function (a, b) {
return a.artist == "Lalo Schifrin"
? 1 // Move it down the list
: 0; // Keep it the same
});
Ответ 6
Попробуйте следующее:
playlist = playlist.concat(playlist.splice(1, 1));
Ответ 7
Если вы хотите только переместить один элемент из произвольной позиции в конец массива, это должно работать:
function toEnd(list, position) {
list.push(list.splice(position, 1));
return list;
}
Если вы хотите переместить несколько элементов из какой-либо произвольной позиции в конец, вы можете сделать:
function toEnd(list, from, count) {
list.push.apply(list, list.splice(from, count));
return list;
}
Если вы хотите переместить несколько элементов из произвольной позиции в произвольную позицию, попробуйте:
function move(list, from, count, to) {
var args = [from > to ? to : to - count, 0];
args.push.apply(args, list.splice(from, count));
list.splice.apply(list, args);
return list;
}