如何比较两个对象数组并为另一个数组中未找到的对象更改属性?

时间:2018-11-30 08:51:50

标签: javascript arrays

我有2个对象数组

android:debuggable="true" tools:ignore="HardcodedDebugMode"

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

这是我的预期结果:

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

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

这是我尝试过的:

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

但这不能给出预期的答案

2 个答案:

答案 0 :(得分:1)

您可以使用地图array2,因为您需要使用先前收集的值更新array1才能决定更新。

var array1 = [{ ID: "1", IsChecked: true }, { ID: "2", IsChecked: true }, { ID: "3", IsChecked: true }, { ID: "4", IsChecked: true }],
    array2 = [{ ID: "1", IsChecked: true }, { ID: "2", IsChecked: true }],
    map = new Map(array2.map(({ ID, IsChecked }) => [ID, IsChecked]));

array1.forEach(o => {
    if (map.get(o.ID)) {
        return;
    }
    o.IsChecked = false;
});

console.log(array1);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

这对我有用。

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

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

array1
  .filter(el => JSON.stringify(array2).indexOf(JSON.stringify(el)) == -1)
  .forEach(el => (el.IsChecked = false));

console.log(array1);

或者,您可以使用

array1
  .filter(el => array2.map(({ID})=>ID).indexOf(el.ID) == -1)
  .forEach(el => (el.IsChecked = false));