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

Jam*_*een 0 javascript arrays object immutability reducers

我有一个对象

usersById: {
  1: { name: 'John' },
  2: { name: 'Michelle' },
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

我猜它会是这样的

return {
  ...usersById,
  ...usersById[2].age = 40
}
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误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]
})
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*uck 7

您的想法是正确的,但语法错误。试试这个:

return {
  ...usersById,
  2: {
    ...usersById[2],
    age: 40
  }
}
Run Code Online (Sandbox Code Playgroud)

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

let key = 2;
return {
  ...usersById,
  [key]: {
    ...usersById[key],
    age: 40
  }
}
Run Code Online (Sandbox Code Playgroud)