将2个数组与嵌套的for循环进行比较

时间:2018-09-12 19:40:14

标签: javascript

我有2个数组:

a = [{name:"test3", input:[{val:3}]}, {name:"ss", input:[{val:84}]},{name:"sss", input:[{val:86}]},{name:"test", input:[{val:6}]}, {name:"some", input:[{val:8}]}]

a2 = [{name: "dd", field:3},{name: "dd", field:6}]

现在我正在尝试使用`

从两个数组中获取唯一值

filter

    a.forEach(function(i){
 i.input.forEach(function(j){
  a2.filter(function(k){return j.val !== k.field;});
});}) 

然后我要使用:forEach(function(p){p.remove()}); //remove the unique values

因此,我正在将第一个数组中的val值与第二个数组中的field值进行比较:

预期结果:

[{name:"ss", input:[{val:84}]},{name:"sss", input:[{val:86}]},{name:"some", input:[{val:8}]}]  // these are the ones whose `val` from `a` does not match with the `field` from `a2`

上面的代码什么也没有返回,任何想法都可能丢失?

2 个答案:

答案 0 :(得分:3)

我认为有一种更简单的方法:

  1. 创建将用于过滤数据的值的列表。
  2. 使用它过滤数据。

const a = [{name: "test3", input: [{val: 3 }] }, {name: "ss", input: [{val: 84 }] }, {name: "sss", input: [{val: 86 }] }, {name: "test", input: [{val: 6 }] }, {name: "some", input: [{val: 8 }] } ]; 
const a2 = [{name: "dd", field: 3 }, {name: "dd", field: 6 }];

const filterBy = a2.map(v => v.field); // [3, 6]
const res = a.filter(el => !el.input.some(input => filterBy.includes(input.val)))

console.log(res)

答案 1 :(得分:1)

通过双精度过滤器查找第二个数组中是否存在具有输入val的元素,从而过滤第一个数组:

let a = [{name:"test3", input:[{val:3}]}, {name:"ss", input:[{val:84}]},{name:"sss", input:[{val:86}]},{name:"test", input:[{val:6}]}, {name:"some", input:[{val:8}]}]

let a2 = [{name: "dd", field:3},{name: "dd", field:6}]

let results = a.filter(e => {
    return a2.filter(q => q.field === e.input['val']).length < 1;
});

console.log(results)