Переопределить индексы сортировки

Из бэкэнда я получаю элементы для объекта с индексами сортировки (случайное число от 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
    }
}

Как я могу добиться этой функциональности?

что на самом деле не работает?

Nina Scholz 15.09.2018 17:58

Почему бы просто не отсортировать все предметы на itemList? Вместо хранения списка индексов с порядком сортировки.

MinusFour 15.09.2018 18:02

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

Nitish Narang 15.09.2018 19:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как этого добиться

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

Nitish Narang 15.09.2018 18:42

Ага, именно то, что я искал. Спасибо!

bashkovpd 16.09.2018 09:15

Другие вопросы по теме