如何比较两个对象数组并为另一个数组中不相等的对象更改属性?

时间:2019-01-28 11:06:46

标签: arrays

我有2个对象数组

var array1 = [{ ID:"1", IsChecked : true}, 
              { ID:"2", IsChecked : true},
              { ID:"3", IsChecked : true},
              { ID:"4", IsChecked : false},
              { ID:"5", IsChecked : false},
              { ID:"6", IsChecked : true}]

var array2 = [{ ID:"1", IsChecked : true},
              { ID:"2", IsChecked : true},
              { ID:"3", IsChecked : true},
              { ID:"4", IsChecked : true}]

我想比较两个对象数组,并为array2中为true(IsChecked:true)的那些对象更改array1(IsChecked:true)的属性?

这是我的预期结果:

array1 = [{ ID:"1", IsChecked : true}, 
          { ID:"2", IsChecked : true},
          { ID:"3", IsChecked : true},
          { ID:"4", IsChecked : true},
          { ID:"5", IsChecked : false},
          { ID:"6", IsChecked : false}]

这是我尝试过的:

var map = new Map(array2.map(({ID,IsChecked})=>[ID,IsChecked]));
                        array1.forEach(o=>{
                            if(map.get(o.ID)){
                                return;
                            }
                            o.IsChecked = false;
                        });

,但对于array2中为true的数组,它返回false。 注意:这两个数组可能包含其他不同的属性。

1 个答案:

答案 0 :(得分:2)

您可以将Array.forEach()Array.find()方法结合使用:

var array1 = [{ ID:"1", IsChecked : true}, 
              { ID:"2", IsChecked : true},
              { ID:"3", IsChecked : true},
              { ID:"4", IsChecked : false},
              { ID:"5", IsChecked : false}]

var array2 = [{ ID:"1", IsChecked : true},
              { ID:"2", IsChecked : true},
              { ID:"3", IsChecked : true},
              { ID:"4", IsChecked : true}]
              
array1.forEach(function(array1Obj){
  array2Obj = array2.find(({ID})=> ID == array1Obj.ID);
  if(array2Obj && array2Obj.IsChecked){
    array1Obj.IsChecked = true;
  }
});   
console.log(array1);