【问题标题】:Using Object.assign and object spread more efficiently更有效地使用 Object.assign 和对象传播
【发布时间】:2018-05-11 01:30:57
【问题描述】:

我正在努力实现以下目标: 假设我有一个这样的对象:

myObj = {
   john: {1: ['a', 'b',..], 2: ['aa', 'vv',...],
   tom: {1: ['ab', 'bb',..], 2: ['aa', 'vv',...],
}

为了实现上述目标,我正在做这样的事情

    function (name, myNum, myList) {
        let myObj = Object.assign({}, state);
        // name and myNum and myList values are passed in for this eg i am 
       // hardcoding
       let name = 'jon';
       let myNum = 1;
       let mylist = [1,2,3];
       // I want to replace the if / else with a more elegant solution
       if (myObj.hasOwnProperty(name)) {
         myObj[name][myNum] = myList;
       } else {
         myObj[name] = {[myNum]: myList};
       }
       return myObj;
      }

我确信有一种更简洁的方法可以做到这一点,使用 Object.assign 或 object spread。

请提出更好的方法。

【问题讨论】:

  • 你能告诉我们你想要做什么或想要的输出是什么吗?
  • 我想要的是创建一个像上面提到的对象。所以 myObj 是一个对象,其值也是对象。我从一个空对象开始,当对象进来时,我想维护他们的地图。想要的东西已经通过那个 if 语句实现了。但我不喜欢这种方式,而是想看看我是否可以更优雅地做同样的事情。

标签: ecmascript-6 ecmascript-next


【解决方案1】:

也许你正在寻找

myObj[name] = Object.assign(myObj[name] || {}, {[myNum]: myList});

你也可以这样做

myObj[name] = {...myObj[name], [myNum]: myList};

但这总是会创建一个新对象。

您还可以将所有内容组合成一个表达式:

function (name, myNum, myList) {
  return {
    ...state,
    [name]: {
      ...state[name],
      [myNum]: myList,
     },
  };
}

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 2018-03-27
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多