Оптимизировать сортировку массива из другого массива - PullRequest
0 голосов
/ 01 октября 2018

У меня есть два массива, один из которых содержит несколько элементов, а другой содержит отсортированные идентификаторы этих элементов, например, так:

const items = [
    { id: 1, label: 'foo' },
    { id: 2, label: 'bar' },
    { id: 3, label: 'lorem' },
    { id: 4, label: 'ipsum' },
]

const sortedItemIds = [4, 3, 2, 1]

Я хочу иметь другой массив, содержащий элементы, отсортированные по ихid вроде так:

const sortedItems = [
    { id: 4, label: 'ipsum' },
    { id: 3, label: 'lorem' },
    { id: 2, label: 'bar' },
    { id: 1, label: 'foo' },
]

Обратите внимание, что порядок может быть не таким, как не asc или desc

Я сделал этот кусок кода, что работает вполне прилично :

let sortedItems = []
sortedItemIds.map((itemId, index) => {
    items.map(item) => {
        if (item.id === itemId) {
            sortedItems[index] = item
        }
    }
})

Я чувствую, что могу столкнуться с проблемами с большим массивом элементов из-за вложенных функций Array.map()

Есть ли лучший способ / лучшие практики для этого сценария?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Вы можете создать один объект, где ключи - это идентификаторы, а затем использовать этот объект для получения значений по идентификатору.

const items = [{ id: 1, label: 'foo' },{ id: 2, label: 'bar' },{ id: 3, label: 'lorem' },{ id: 4, label: 'ipsum' }]
const sortedItemIds = [4, 3, 2, 1]

const obj = {}
items.forEach(o => obj[o.id] = o);

const sortedItems = sortedItemIds.map(e => Object.assign({}, obj[e]));
console.log(sortedItems)
0 голосов
/ 01 октября 2018

Для этого вам не нужна карта функций, просто используйте find Array.indexOf и Array.sort, чтобы отсортировать ее.

const items = [{ id: 1, label: 'foo' },{ id: 2, label: 'bar' },{ id: 3, label: 'lorem' },{ id: 4, label: 'ipsum' }],
      sortedItemIds = [4, 3, 2, 1];

items.sort((a, b) => sortedItemIds.indexOf(a.id) - sortedItemIds.indexOf(b.id));
console.log(items);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...