Вы можете сделать это в четыре шага:
Используйте Array.findIndex()
, чтобы найти запись, имеющую то же значение, что и значение, которое вы хотите обновить по данному индексу.
Затем измените значение этой записи на значение элемента по указанному индексу.
Затем обновите элемент по указанному индексу с помощью новогозначение.
Наконец, поменяйте местами элементы.Если не было элемента с новым значением, отсортируйте массив, чтобы убедиться, что элемент помещен в правильную позицию.
Эта версия мутирует массив:
const array = [{id:"5a2524432b68c725c06ac987",customOrder:1,name:"One",},{id:"5a2524432b68sgs25c06ac987",customOrder:2,name:"Two",},{id:"5a252wfew32b68c725c06ac987",customOrder:3,name:"Three",},{id:"5a25gffe32b68c725c06ac987",customOrder:4,name:"Four",},{id:"5a2524432b68c725c06acfee7",customOrder:5,name:"Five",},{id:"5a2524432b68c725c06ac556",customOrder:6,name:"Six",},]
const swap = (arr, x, y) => [arr[x], arr[y]] = [arr[y], arr[x]];
function setOrder(arr, idx, value) {
const idx2 = arr.findIndex(x => x.customOrder === value);
if (idx2 >= 0) arr[idx2].customOrder = arr[idx].customOrder;
arr[idx].customOrder = value;
if (idx2 >= 0) swap(arr, idx, idx2);
else arr.sort((a, b) => a.customOrder - b.customOrder);
return arr;
}
setOrder(array, 2, 4);
console.log(array);
setOrder(array, 2, 10);
console.log(array);
Эта версия не изменяет массив:
const array = [{id:"5a2524432b68c725c06ac987",customOrder:1,name:"One",},{id:"5a2524432b68sgs25c06ac987",customOrder:2,name:"Two",},{id:"5a252wfew32b68c725c06ac987",customOrder:3,name:"Three",},{id:"5a25gffe32b68c725c06ac987",customOrder:4,name:"Four",},{id:"5a2524432b68c725c06acfee7",customOrder:5,name:"Five",},{id:"5a2524432b68c725c06ac556",customOrder:6,name:"Six",},]
const swap = (arr, x, y) => [arr[x], arr[y]] = [arr[y], arr[x]];
function setOrder(arr, idx, value) {
const out = [...arr];
const idx2 = out.findIndex(x => x.customOrder === value);
if (idx2 >= 0) out[idx2] = { ...out[idx2], customOrder: out[idx].customOrder };
out[idx] = { ...out[idx], customOrder: value };
if (idx2 >= 0) swap(out, idx, idx2);
else out.sort((a, b) => a.customOrder - b.customOrder);
return out;
}
console.log(setOrder(array, 2, 4));
console.log(setOrder(array, 2, 10));