修改对象数组中的对象属性

var foo = [{ bar: 1, baz: [1,2,3] }, { bar: 2, baz: [4,5,6] }]; var filtered = $.grep(foo, function(v){ return v.bar === 1; }); console.log(filtered); 

http://jsfiddle.net/98EsQ/

有没有办法在不创建新数组和/或对象的情况下修改某个对象属性(比如我上面要过滤的属性)?

期望的结果: [{ bar: 1, baz: [11,22,33] }, { bar: 2, baz: [4,5,6] }]

当然,只需改变它:

使用jQuery的$.each

 $.each(foo, function() { if (this.bar === 1) { this.baz[0] = 11; this.baz[1] = 22; this.baz[2] = 33; // Or: `this.baz = [11, 22, 33];` } }); 

使用ES5 forEach

 foo.forEach(function(obj) { if (obj.bar === 1) { obj.baz[0] = 11; obj.baz[1] = 22; obj.baz[2] = 33; // Or: `obj.baz = [11, 22, 33];` } }); 

…或者你在其他SO答案中有其他循环选项 。

没有jQuery和向后兼容性

 for (var i = 0; i < foo.length; i++) { if (foo[i].bar === 1) { foo[i].baz = [11,12,13]; } } 

我们也可以通过使用Array的map函数来实现这一点:

  foo.map((obj) => { if(obj.bar == 1){ obj.baz[0] = 11; obj.baz[1] = 22; obj.baz[2] = 33; } }) 
 $.each(foo,function(index,value) { if(this.bar==1) { this.baz[0] = 11; this.baz[1] = 22; this.baz[2] = 33; } }); 

但是for循环比$ .each快,所以你可以尝试使用

 for(var i=0; i  

您可以使用find并更改其属性。

 let foo = [{ bar: 1, baz: [1,2,3] }, { bar: 2, baz: [4,5,6] }]; let obj = foo.find(f=>f.bar==1); if(obj) obj.baz=[2,3,4]; console.log(foo);