Chefranov
@Chefranov
Новичок

Как обновлять значения объекта, а не переписывать их?

Есть функция
function updateStorage(result) {
      const dataFromStorage = JSON.parse(localStorage.getItem('links'))

      const index = dataFromStorage.findIndex(d => d.id === result.id)
      dataFromStorage[index] = Object.assign({}, dataFromStorage[index], result)

      localStorage.setItem('links', JSON.stringify(dataFromStorage))
    }

Когда пытаюсь обновить данные, то они не обновляются, а перезаписывают внутренний объект
var result = {
            id: id,
            PageSpeedInsights: {
              [preloaderType]: false,
              [errorStatus]: false,
              [type]: +(lighthouse.categories.performance['score'] * 100).toFixed()
            }
          }
          updateStorage(result)

Как можно обновлять данные (PageSpeedInsights), а не полностью заменять?

Данные до выполнения функции
5ede8ccd9c95f277707134.png
Данные после выполнения
5ede8cdbd3148422245072.png
  • Вопрос задан
  • 403 просмотра
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Если откинуть шелуху, вопрос сводится к тому, как объединять объекты «глубоко» — как делать deep merge.
Довольно частый вопрос и есть несколько решений: использовать готовую библиотеку или написать рекурсивный обход свойств объекта: если свойство это объект, то (повторить для него). Если свойство примитив то скопировать.
Ответ написан
Комментировать
Chefranov
@Chefranov Автор вопроса
Новичок
Нашел функцию для объединения двух объектов с вложенными в них объектами
const merge = (target, source) => {
    for (const key of Object.keys(source)) {
        if (source[key] instanceof Object) Object.assign(source[key], merge(target[key], source[key]))
    }

    Object.assign(target || {}, source)
    return target
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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