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

IT技术 javascript jquery
2021-03-07 16:03:09
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] }]

6个回答

.map使用扩展( ...) 运算符

var result = foo.map(el => el.bar == 1 ? {...el, baz: [11,22,33]} : el);

我无法根据 prev 值更新“baz”,只能完全更改 prop 值。
2021-04-17 16:03:09

当然,只需更改它:

使用 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 答案中其他循环选项

您可以使用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);

仅当您知道您将始终有一个匹配项时,这才有用
2021-05-03 16:03:09
@AdiG 是的。如果您正在查看多个,最map好像这个答案一样使用
2021-05-16 16:03:09

没有 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;
   }
 })