使用es6 map更新属性值的对象数组

时间:2017-03-08 00:00:57

标签: 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 'Alice' === obj.name ? obj.age= newage : obj
    )

我为了循环而不是正常映射的原因是我不想改变原始人物对象,这是正确的吗?

2 个答案:

答案 0 :(得分:2)

问题在于,当您使用Array.map循环遍历数组时,您访问并更新年龄的对象仍然是原始对象,并将完全相同的对象推送到{{1}的新数组创造。

因此,解决此问题的直观方法是克隆新对象并更新新对象。我为你做了example所以你可以看到结果。

Array.map

答案 1 :(得分:0)

如果您希望原始数组保持不变并使用更新的对象创建一个新数组,请尝试以下操作:

var person = [
	  {
	    "name": "Alice",
	    "age": 10
	  },
	  {
	    "name": "Samantha",
	    "age": 20
	  },
	  {
	    "name": "Mary",
	    "age": 19
	  }
	];

const newage = 11;
var newPerson = [];
for (var i = 0; i<person.length; i++){
	var ageVal = person[i].name == 'Alice' ? newage : person[i].age;
	newPerson.push({name: person[i].name, age: ageVal});
}
console.log('Original person object:');
console.log(person);
console.log('Modified newPerson object:');
console.log(newPerson);