Из бэкэнда я получаю элементы для объекта с индексами сортировки (случайное число от 1 до 999) и массив списка элементов с идентификаторами элементов, отсортированных по их индексам, например:
{
items: {
1: {
sort: 131,
name: 'Item 1'
},
2: {
sort: 22,
name: 'Item 2'
},
3: {
sort: 440,
name: 'Item 3'
},
4: {
sort: 80,
name: 'Item 4'
}
},
itemList: [2, 4, 1, 3]
}
Используя пользовательский интерфейс, пользователь может изменить порядок элементов, которые отражаются в массиве itemList. После нажатия кнопки сохранения в пользовательском интерфейсе мне нужно правильно переназначить существующие индексы сортировки и отправить в бэкэнд только элементы, индекс которых был изменен. Так, например, если пользователь установил item 2 во вторую позицию, itemsList будет [4, 2, 1, 3], а данные, отправленные на бэкэнд, должны быть:
{
2: {
sort: 80
},
4: {
sort: 22
}
}
Если пользователь установил item 2 на четвертую позицию, itemList будет [4, 1, 3, 2], а данные, отправленные на бэкэнд, должны быть:
{
1: {
sort: 80
},
2: {
sort: 440
},
3: {
sort: 131
},
4: {
sort: 22
}
}
Как я могу добиться этой функциональности?
Почему бы просто не отсортировать все предметы на itemList? Вместо хранения списка индексов с порядком сортировки.
Насколько я понимаю, в своем ответе я создал метод getUpdatedItems (), в котором вы передаете новый список элементов, который сравнивается со старым списком элементов и регистрирует изменения способа отправки на сервер. Пожалуйста, подтвердите, требуется ли это?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот как этого добиться
var getUpdatedItems = (function() {
var items = {
1: {
sort: 131,
name: 'Item 1'
},
2: {
sort: 22,
name: 'Item 2'
},
3: {
sort: 440,
name: 'Item 3'
},
4: {
sort: 80,
name: 'Item 4'
}
},
itemsList = [];
function _getUpdatedItems(newItemsList) {
itemsList = Object.entries(items).sort(([,a], [,b]) => a.sort - b.sort).map(([data]) => data);
var dataToSend = {};
newItemsList.forEach((key, index) => key != itemsList[index] && (dataToSend[key] = { sort: items[itemsList[index]].sort }))
console.info(dataToSend)
}
return _getUpdatedItems;
})()
// you can test with below test and you will get expected result
getUpdatedItems([4,2,1,3])
getUpdatedItems([4,1,3,2])
Сообщите мне, если это то, чего вы пытаетесь достичь? @bashkovpd
Ага, именно то, что я искал. Спасибо!
что на самом деле не работает?