Как поменять порядок элементов внутри массива, не затронув порядок других?

Есть массив с объектами:

const currentArr = [{id: 1, name: "User№1"}, {id: 2, name: "User№2"}, {id: 3, name: "User№3"}, {id: 4, name: "User№4"}];

Задача написать функцию которая принимает в себя два индекса(старого элемента, и нового местоположения в массиве); К примеру moving(0, 3); Результат который хочу увидеть: [{id: 4, name: "User№4"}, {id: 2, name: "User№2"}, {id: 3, name: "User№3"},{id: 1, name: "User№1"}]; - При этом важно, чтоб все остальные элементы оставались в таком же порядке как и были (Это Важно!)

Подскажите пож. как это можно реализовать? Все никак не получается, именно чтоб другие элементы оставались в таком же порядке. Потому что если я делаю splice() и потом push, порядок уже меняетсяс(


Ответы (2 шт):

Автор решения: Rudi

Можно что-то такое сделать..

const m = [{id: 1, name: "User№1"}, {id: 2, name: "User№2"}, {id: 3, name: "User№3"}, {id: 4, name: "User№4"}];

function move(oldIndex, newIndex, arr) {
  if(oldIndex < 0 || newIndex < 0 || oldIndex > arr.length || newIndex > arr.length) return false
  let res = [];
  for(var i = 0; i < arr.length; i++){
    if(i == newIndex) {
      res[oldIndex] = arr[newIndex];
      res[newIndex] = arr[oldIndex];
      continue
    }
    res[i] = arr[i]
  }
  return res
}

console.log(move(0, 3, m))

→ Ссылка
Автор решения: vikttur_Stop_RU_war_in_UA
function moving(arr, index1, index2) {
    minIndex = Math.max(0, Math.min(index1, index2));
    maxIndex = Math.min(arr.length-1, Math.max(index1, index2));

    const maxElement = arr.splice(maxIndex, 1, arr[minIndex]);
    arr.splice(minIndex, 1, ...maxElement);
    
    return arr;
}

console.table(moving(currentArr, 10, -5));
→ Ссылка