我想更改每个循环中的当前对象,但它不起作用,为什么它不起作用,我该怎么做?Js在每个循环中更改数组内的对象
var arr = [{num: 1}, {num: 2}];
arr.forEach(function(item) {
item = {somethingElse: 1}
});
console.log(arr);
我想更改每个循环中的当前对象,但它不起作用,为什么它不起作用,我该怎么做?Js在每个循环中更改数组内的对象
var arr = [{num: 1}, {num: 2}];
arr.forEach(function(item) {
item = {somethingElse: 1}
});
console.log(arr);
它不工作,因为你正在做的是更新你给出的参数(item
),不具有对数组的实时连接的值。只要您的回调返回,该更改就会消失。
最合适的方式做到这一点是使用map
:
var arr = [{num: 1}, {num: 2}];
arr = arr.map(function(item) {
return {somethingElse: 1};
});
console.log(arr);
map
给你的函数的每个项目,并建立一个新阵列从任何你回来。
如果您更新就地阵列,而不是建立一个新的这一点很重要,你可以使用forEach
,你只需要分配回你在更新数组元素。第二个参数forEach
的回调是你所访问的指数,所以:
var arr = [{num: 1}, {num: 2}];
arr.forEach(function(item, index) {
arr[index] = {somethingElse: 1};
});
console.log(arr);
当然,在这两种情况下上面,你会真正使用item
的东西,你不是活得t在您的示例代码中...如果您想要在item
上添加/删除属性,请不要完全替换该对象,Cyril's answer会向您显示如何执行此操作。
@epascarello:谢谢,修正。 –
您正在更改回调函数中的本地参考item
。
要改变数组的内容,你需要使用数组索引和分配新的参考吧,如下图所示
arr.forEach(function(item, i) {
arr[i] = {somethingElse: 1} //using index, change the reference in array
});
你是不是在对象上工作,所以更改不会转移。
你可以这样做,而不是:
arr.forEach(function(item, ind, array) {
array[ind] = {somethingElse: 1}
});
另一个品种答案
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
});
是的,这是另一种可能性:突变对象。 –
我相信你的意思是映射列表? 'arr.map(function(item){return {somethingElse:1}});' – Ziki