在JavaScript中返回带有一些额外属性的新对象

时间:2017-10-19 16:00:38

标签: javascript arrays object immutability reducers

我有一个对象

usersById: {
  1: { name: 'John' },
  2: { name: 'Michelle' },
  ...
}

我想返回相同的对象,但首先使用新属性age填充id = 2的对象,但坚持不变性。

我猜它会像

return {
  ...usersById,
  ...usersById[2].age = 40
}

但收到错误In this environment the sources for assign MUST be an object. This error is a performance optimization and not spec compliant

或者,我猜它应该像

return Object.keys(usersById).map(userId => {
  if (userId === 2) {
    return {
      ...usersById[2],
      ...age = 40
    }
  }
  return usersById[userId]
})

但它返回一个数组而不是一个对象。

2 个答案:

答案 0 :(得分:3)

你有正确的想法,但错误的语法。试试这个:

function CheckAnswer (answer){
    if(Quiz[qpos][5] == answer) {
        correctans++; 
    };
    getnextQuestion();  
};


function getnextQuestion() {
    qpos++;
    getQuestions();
};

或者如果密钥是动态的,您可以这样做:

return {
  ...usersById,
  2: {
    ...usersById[2],
    age: 40
  }
}

答案 1 :(得分:0)

您可以使用自己的函数返回具有填充值的同一对象

简单示例:

var usersById =  {
  1: { name: 'John' },
  2: { name: 'Michelle' },
}

usersById = oneLevelDeepAssign(usersById,2,{age:21})


function oneLevelDeepAssign(object, key, objectToAssign){

  return Object.assign({},object,{[key]:Object.assign({},object[key],objectToAssign)})

}

console.log(usersById);