Подтвердить что ты не робот

Переупорядочивающие массивы

Скажем, у меня есть массив, который выглядит так:

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);

Но это не сработает.

4b9b3361

Ответ 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;
}