Search code examples
ecmascript-6ecmascript-next

Using Object.assign and object spread more efficiently


I am trying to achieve the following: Say i have an object like this:

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

To achieve the above i am doing something like this which works

    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;
      }

I am sure there is a much cleaner way to do this, using Object.assign or object spread.

Please advice what would be better approach.


Solution

  • Maybe you are looking for

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

    You can also do

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

    but this will always create a new object.

    You can also combine everything into a single expression:

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