Js为每个循环更改数组内的对象

use*_*232 16 javascript

我想为每个循环更改当前对象并且它不起作用,为什么它不起作用,我该怎么做?

var arr = [{num: 1}, {num: 2}];

arr.forEach(function(item) {
  item = {somethingElse: 1}
});

console.log(arr);
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 36

它不起作用,因为你所做的只是更新你给出的参数的值(item),它没有与数组的实时连接.一旦您的回调返回,该更改就会消失.

最合适的方法是使用map:

var arr = [{num: 1}, {num: 2}];

arr = arr.map(function(item) {
  return {somethingElse: 1};
});

console.log(arr);
Run Code Online (Sandbox Code Playgroud)

map为每个项目提供函数,并根据您返回的内容构建一个数组.

如果您必须就地更新阵列而不是构建新阵列,那么您可以使用forEach,您只需要分配回您正在更新的数组元素.forEach回调的第二个参数是您正在访问的索引,因此:

var arr = [{num: 1}, {num: 2}];

arr.forEach(function(item, index) {
  arr[index] = {somethingElse: 1};
});

console.log(arr);
Run Code Online (Sandbox Code Playgroud)

当然,在上面两种情况下,你实际上都在使用item某些东西,你不在你的示例代码中......如果你想要添加/删除属性item,而不是完全替换对象,Cyril的答案会告诉你如何要做到这一点.


Cyr*_*ian 6

答案列表的另一个变种

var arr = [{num: 1}, {num: 2}];

arr.forEach(function(item) {
  item.something = 2;//setting the value
  delete item.num;//deleting the num from the object
});
Run Code Online (Sandbox Code Playgroud)