@dc65k

Как оптимизировать обновление данных?

Всем привет, есть структура данных:

const data = [
    [
        { id: 1, key: 10, val: 0 },
        { id: 2, key: 11, val: 0 },
    ],
    [
        { id: 3, key: 1, val: 0 },
        { id: 4, key: 2, val: 0 },
    ],
    [
        { id: 5, key: 9, val: 0 },
        { id: 6, key: 5, val: 0 },
        { id: 7, key: 4, val: 0 },
        { id: 8, key: 12, val: 0 },
    ]
]


Мне необходимо вернуть новый массив с обновлёнными данными, например, для id 4
Мой вариант реализации:
const update = (array, key, val) => {

    return array.reduce((accumulator, currentValue) => {

        const item = currentValue.reduce((acc, c) => {

            if (c.key === key) {
                c.val = val
            }

            acc.push(c)

            return acc
        }, [])

        accumulator.push(item)

        return accumulator
    }, [])
}

console.log(update(data, 4, 100));


Подскажите, можно ли решить более оптимально?
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
во первых, если ты меняешь сами объекты, то незачем создавать новые массивы. Просто обходи вложенным циклом и ставь значение, если key совпал. Потом возвращай тот же массив.

во вторых, чтобы каждый раз не обходить весь набор, естественным образом напрашивается идея сделать индекс: карту Map, где ключами будут key, а значениями - массивы объектов с таким key. Тогда обновление будет моментальное:
const update = (array, map, key, val) => {
    const arr = map.get(key);
    if (arr) {
        arr.forEach((obj) => {obj.val = val;}
    }
    return array;
};


но при изменении набора надо будет подправлять и индекс.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы