Обновление объекта основывается на наличии ключа, иначе формируется новый объект: Javascript - PullRequest
0 голосов
/ 27 января 2020

Есть объект со следующим форматом:

let obj = {
  p2: {
    p21: [
      {
        key1: "val1",
        value1: "val2"
      },
      {
        prop: "test",
        value: "dummy"
      }
    ]
  }
}

Мне нужно посмотреть, есть ли объект с ключом "prop", и заменить его на любое переданное значение. Если такого ключа нет, создайте объект с { "prop" : "test" , value: passed_value} и добавьте его в массив p21. Также этот объект, содержащий ключ "prop", может присутствовать в любом месте массива p21

Должно быть что-то вроде этого

function checkAndUpdate(replacingValue) {
    if(obj's p21 has key name "prop")
    {
      //update its "value" to the passed "replacingValue"

    }
    else //if "prop" key not present
    {
       // create an object with { "prop": "test" , value: replacingValue} and add it to p21 array        
    }  
  }

Попробовал следующее:

obj.p2.p21.map((elem) => {
    if(Object.keys(elem)[0] === "prop") 
        elem.value = updateValue;
})

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вы можете использовать Array.find, чтобы найти объект, hasOwnProperty prop и обновить

let obj = {
  "p2": {
    "p21": [{
      "key1": "val1",
      "value1": "val2",
    },
    {
      "prop": "test",
      "value": "dummy"
    }
    ]
  }
}
function rep(value) {
  if (!value.length) {
    obj.p2.p21 = [...obj.p2.p21].filter(e => e.hasOwnProperty('prop'));
    return;
  }
  let ele = obj.p2.p21.find(e => e.hasOwnProperty('prop'));
  if (ele) {
    ele.value = value
    return;
  }
  obj.p2.p21.push({
    "prop": "test",
    value
  })
}

rep('test');
console.log(JSON.stringify(obj))
rep('');
console.log(JSON.stringify(obj))
1 голос
/ 27 января 2020

Используйте .findIndex, чтобы найти индекс соответствующего объекта. Если он существует, .slice массив до и после него, а в середине вставьте обновленный объект. В противном случае просто распределите объект по массиву:

let obj = {
  "p2": {
    "p21": [{
        "key1": "val1",
        "value1": "val2",
      },
      {
        "prop": "test",
        "value": "dummy"
      }
    ]
  }
}

function checkAndUpdate(value) {
  const newObj = { prop: 'test', value} 
  const arr = obj.p2.p21;
  const index = arr.findIndex(obj => obj.hasOwnProperty('prop'));
  const newArr = index !== -1
    ? [...arr.slice(0, index), newObj, ...arr.slice(index + 1)]
    : [...arr, newObj];
  const fullNewObj = {
    ...obj,
    p2: {
      ...obj.p2,
      p21: newArr
    }
  };
  return fullNewObj;
}
console.log(checkAndUpdate('foo'));

Чтобы также проверить, является ли value неопределенным, и удалить соответствующий объект из массива, если так, просто сделайте соответствующие проверки if и нарежьте массив по мере необходимости:

let obj = {
  "p2": {
    "p21": [{
        "key1": "val1",
        "value1": "val2",
      },
      {
        "prop": "test",
        "value": "dummy"
      }
    ]
  }
}

function checkAndUpdate(value) {
  const newObj = { prop: 'test', value} 
  const arr = obj.p2.p21;
  const index = arr.findIndex(obj => obj.hasOwnProperty('prop'));
  const newArr = (() => {
    if (index === -1) {
      if (value === undefined) {
        return arr;
      }
      return [...arr, newObj];
    }
    if (value === undefined) {
      return [...arr.slice(0, index), ...arr.slice(index + 1)];
    }
    return [...arr.slice(0, index), newObj, ...arr.slice(index + 1)];
  })();
  const fullNewObj = {
    ...obj,
    p2: {
      ...obj.p2,
      p21: newArr
    }
  };
  return fullNewObj;
}
console.log(checkAndUpdate('foo'));
...