Обновите значения на многоуровневом вложенном объекте с помощью JavaScript - PullRequest
0 голосов
/ 31 января 2019

У меня есть объект в sessionStorage, для которого мне нужно обновить значения при вводе пользователем.Я могу обновить в корне объекта, но не значения, вложенные на более глубоком уровне.

request('http://localhost:7474/graphql/', query).then(data => {...}

sessionStorage.setItem('queryData', JSON.stringify(data));

function update(value){
    let prevData = JSON.parse(sessionStorage.getItem('queryData'));

    Object.keys(value).forEach(function(val, key){
        prevData[val] = value[val];
    });

    sessionStorage.setItem('queryData', JSON.stringify(prevData));
}

update({ maritalStatus: "single" });

Таким образом, maritalStatus в конечном итоге был добавлен, а не заменен, и я должен заменить значение:

Object: [,...]
   0: {id: "x", maritalStatus: "married"} //want to replace this value here
   maritalStatus: "single"  // this is where the value is been written

1 Ответ

0 голосов
/ 31 января 2019

Ваши данные в хранилище - это массив.Таким образом, способ его обновления, например prevData[val] = value[val];, заключается в добавлении другого свойства в массив с индексом maritalStatus и значением "single".Объект с индексом 0 не тронут.

Мое предлагаемое исправление также должно включать id в ваш вызов обновления.Затем переберите массив в хранилище и найдите объект с соответствующим идентификатором.

Как только идентификатор совпадает, обновите этот объект или зарегистрируйте, если не найдено ни одного идентификатора.

let dataInStorage = [{
  id: "x",
  maritalStatus: "married"
}];

function update(updateObj) {
  let prevData = dataInStorage;
  let id = updateObj.id;

  dataInStorage.forEach(function(data) {
    if (data.id === id) {
      Object.keys(updateObj).forEach(function(key, index) {
        data[key] = updateObj[key];
      });
    } else {
      console.log(`did not find object with id: ${id}`);
    }
  });
  console.log(prevData)
  //sessionStorage.setItem('queryData', JSON.stringify(prevData));
}

update({
  id: "x",
  maritalStatus: "single"
});
...