是否有更短/更有效的方法在javascript中使用扩展运算符来更新密钥的值?

sab*_*sab 2 javascript ecmascript-6

我最近对使用spread运算符语法感兴趣,所以我尝试了一些例子,我有这个数组的例子:

var entities = [
  {
    "id": 1,    
    "age": 33,
    "hobby": "games"
  },
  {
    "id": 2,
    "age": 28,
    "hobby": "chess"
  },
  {
    "id": 3,
    "age": 21,
    "hobby": "comics"
  },
  {
    "age": 23,
    "hobby": "games"
  }
]
Run Code Online (Sandbox Code Playgroud)

然后,要在"一次"更新所有爱好,我会执行以下操作:

entities.forEach(function(entity, index) {
  this[index] = {...entity, hobby: "Some String to update all hobbies"};
}, entities);
console.log(entities)
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我想知道在使用扩展运算符时是否有更高效或更短的方法来实现它.有什么建议?
编辑:
forEach对我来说不是必需的,甚至不是这样做的,我很好奇是否可以使用扩展语法来更新嵌套值

ic3*_*3rg 8

当您更新列表时,扩展运算符并没有真正帮助,就像您在示例中所做的那样.更新每个对象的属性更容易:

var entities = [ { "id": 1, "age": 33, "hobby": "games" }, { "id": 2, "age": 28, "hobby": "chess" }, { "id": 3, "age": 21, "hobby": "comics" }, { "age": 23, "hobby": "games" } ]

entities.forEach(entity => {
  entity.hobby = "Some String to update all hobbies";
});

console.log(entities)
Run Code Online (Sandbox Code Playgroud)

如果要创建对象的副本,则扩展运算符很​​有用,就像您可能希望在以下情况中那样.map:

var entities = [ { "id": 1, "age": 33, "hobby": "games" }, { "id": 2, "age": 28, "hobby": "chess" }, { "id": 3, "age": 21, "hobby": "comics" }, { "age": 23, "hobby": "games" } ]

const newEntities = entities.map(entity =>
  ({...entity, hobby: "Some String to update all hobbies"})
);

console.log(newEntities)
Run Code Online (Sandbox Code Playgroud)

  • “如果您想创建对象的副本,则展开运算符很有用” 您可能要注意,这只会生成浅表副本。如果 `entity` 中的任何值本身就是对象,则使用扩展运算符创建的新对象仍将引用这些对象值。 (2认同)