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

Joh*_*han 28 javascript jquery

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);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/98EsQ/

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

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

Pio*_*rek 41

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

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


T.J*_*der 27

当然,只需改变它:

使用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];`
    }
});
Run Code Online (Sandbox Code Playgroud)

使用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];`
    }
});
Run Code Online (Sandbox Code Playgroud)

...或者你在其他SO答案中其他循环选项.


Dav*_*ker 8

没有jQuery和向后兼容性

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


Sur*_*Rao 8

您可以使用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);
Run Code Online (Sandbox Code Playgroud)


gil*_*niy 8

    const objArr = [
        {prop1: 'value1', prop2: 'value11'},
        {prop1: 'value2', prop2: 'value22'},
        {prop1: 'value3', prop2: 'option33'},
        {prop1: 'value4', prop2: 'option44'}
    ]

    const newObjArr = objArr.map(obj => {
            if (['value1', 'value2'].includes(obj.prop1)) {
                return {...obj, prop1: 'newValue'}
            }
            return obj
        }
    )
    
    // const responseGotten = [
    //     { prop1: 'newValue', prop2: 'value11' },
    //     { prop1: 'newValue', prop2: 'value22' },
    //     { prop1: 'value3', prop2: 'option33' },
    //     { prop1: 'value4', prop2: 'option44' }
    // ]
Run Code Online (Sandbox Code Playgroud)


Mah*_*wal 5

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

 foo.map((obj) => {
   if(obj.bar == 1){
     obj.baz[0] = 11;
     obj.baz[1] = 22;
     obj.baz[2] = 33;
   }
 })
Run Code Online (Sandbox Code Playgroud)