Изменение свойства объекта в массиве объектов
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] }]
Ответы
Ответ 1
Конечно, просто измените его:
С помощью 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.
Ответ 2
Без jQuery и обратной совместимости
for (var i = 0; i < foo.length; i++) {
if (foo[i].bar === 1) {
foo[i].baz = [11,12,13];
}
}
Ответ 3
Вы можете использовать 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);
Ответ 4
Мы также можем добиться этого, используя функцию отображения массива:
foo.map((obj) => {
if(obj.bar == 1){
obj.baz[0] = 11;
obj.baz[1] = 22;
obj.baz[2] = 33;
}
})
Ответ 5
$.each(foo,function(index,value)
{
if(this.bar==1)
{
this.baz[0] = 11;
this.baz[1] = 22;
this.baz[2] = 33;
}
});
но для цикла быстрее, чем $.each, поэтому вы можете попробовать использовать
for(var i=0; i <foo.length; i++)
{
if(foo[i].bar==1)
{
//change the code
}
}
Ответ 6
Но прежде чем выбрать какой-либо из упомянутых методов, имейте в виду проблемы производительности, связанные с каждым из подходов.
Object iterate For-In, average: ~240 microseconds.
Object iterate Keys For Each, average: ~294 microseconds.
Object iterate Entries For-Of, average: ~535 microseconds.
Справочник - 3 ошибки производительности JavaScript вы должны прекратить делать
Ответ 7
Вы можете использовать функцию фильтра JavaScript.
obj = [
{inActive:false, id:1},
{inActive:false, id:2},
{inActive:false, id: 3}
];
let nObj = obj.filter(ele => {
ele.inActive = true;
return ele;
});
console.log(nObj);