@Alex10214

Как перезатереть объект в массиве по айди?

Всем доброго времени суток. У меня есть массив:
arrData[
      {
        name: 'Alex'
        id: 111
        num: 9379992
      },
      {
        name: 'Ivan'
        id: 222
        num: 2222222
      }
    ]

Ком мне в определенный момент прилетают новые данные объекта по id 111. Как мне перезаписать эти данные в массиве? Подскажите пожалуйста.
  • Вопрос задан
  • 292 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Заменить объект на новый:

const index = arr.findIndex(n => n.id === newObj.id);
if (index !== -1) {
  arr[index] = newObj;
} else {
  arr.push(newObj);
}

Обновить существующий объект:

const obj = arr.find(n => n.id === newObj.id);
if (obj) {
  Object.assign(obj, newObj);
} else {
  arr.push(newObj);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dollar
@dollar
Делай добро и бросай его в воду.
Лучше всего поменять подход к созданию этой структуры.
А именно, если вам нужно искать по id - сделать отдельный объект (по сути хеш-таблицу), где ключами будут выступать именно id.

Для существующего массива arrData делается примерно так:
var obj_by_id = {} //хеш-таблица
arrData.forEach( (obj, index) => {
  obj_by_id[obj.id] = obj;
  obj.index = index;
});

Это немного не честно, но в этом примере индекс я сохраняю в самом объекте.

Далее получить ссылку на объект с id 111 можно будет так:
let o = obj_by_id[111];
o.name = "Kate";


Если нужно заменить, то как-то так:
arrData[obj_by_id[111].index] = { ...... } //новый объект


Естественно, что при такой схеме нужно обновлять obj_by_id при каждом изменении arrData. Это такие операции, как добавление, удаление, всякие там смещения индексов и пр. Да вы и сами это понимаете, надеюсь.

Большой плюс такого подхода в том, что не нужно перебирать весь массив каждый раз (если исходить из предположения, что он может быть очень большим). А это минимизирует нагрузку на процессор.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы