Javascript 使用es6映射根据属性值更新对象数组

Javascript 使用es6映射根据属性值更新对象数组,javascript,ecmascript-6,Javascript,Ecmascript 6,我有这个对象数组 [ { "name": "Alice", "age": 10 }, { "name": "Samantha", "age": 20 }, { "name": "Mary", "age": 19 } ] 如何将Alice的年龄更新到11岁 我试着使用es6地图 const newage = 11; const newDate = person.map(obj => return 'Al

我有这个对象数组

[
  {
    "name": "Alice",
    "age": 10
  },
  {
    "name": "Samantha",
    "age": 20
  },
  {
    "name": "Mary",
    "age": 19
  }
]
如何将Alice的年龄更新到11岁

我试着使用es6地图

const newage = 11;
 const newDate = person.map(obj => 
      return 'Alice' === obj.name ? obj.age= newage : obj
    )

我之所以选择map而不是normal for loop,是因为我不想改变原始的person对象,对吗?

问题是,当您使用array.map在数组中循环时,访问和更新年龄的对象仍然是原始对象,然后将完全相同的对象推送到
array.map
创建的新数组中

所以解决这个问题的直观方法是克隆新对象并更新新对象。我为你做了一个测试,这样你就可以看到结果了

const original = [
  {"name": "Alice","age": 10},
  {"name": "Samantha","age": 20},
  {"name": "Mary","age": 19}
];
const newage = 11;
const newData = original.map(obj => {
  // clone the current object
  const newObj = Object.assign({}, obj);
  // update the new object
  if (newObj.name === 'Alice') newObj.age = newage;
  return newObj;
});
“正确吗?”No.
.map
将创建一个新数组,但
obj.age=newage
仍将变异对象<代码>.map在ES6 btw之前已经存在。