JavaScript从对象数组中获取不在另一个对象数组中的元素

Dan*_*ana 20 javascript arrays javascript-objects

我是JavaScript编程的新手,我有两个具有以下结构的对象数组:

myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];
Run Code Online (Sandbox Code Playgroud)

我需要获得两个包含key值的独立数组foo,第一个包含第一个数组但不在第二个数组中的数组,基于key的值,foo第二个包含mySecondObjArray但不在myFirstObjArray.

有没有办法做到这一点没有

for(i=0;i<myFirstObjArray.length;i++)
   for(j=0;j<mySecondObjArray .length;j++)
      {...build first array here}

for(i=0;i<mySecondObjArray .length;i++)
   for(j=0;j<myFirstObjArray.length;j++)
      {...build second array here}
Run Code Online (Sandbox Code Playgroud)

?也许我的问题是一个我没找到的重复问题,所以请保持温和.

预期产量:

firstArray = [{foo: 1}, {foo: 3}];
secondArray = [{foo: 2}, {foo: 5}];
Run Code Online (Sandbox Code Playgroud)

Geo*_*ley 15

您可以通过基于其他数组元素设置条件来简单地过滤一个数组的元素.

var myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}],
    mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}],
    
    firstArray  = myFirstObjArray.filter(o=> !mySecondObjArray.some(i=> i.foo === o.foo));
    
    secondArray  = mySecondObjArray.filter(o=> !myFirstObjArray.some(i=> i.foo === o.foo));
    
    console.log(firstArray.map(o=> {return {'foo' :  o.foo}}))
    console.log(secondArray.map(o=> {return {'foo' :  o.foo}}))
Run Code Online (Sandbox Code Playgroud)

PS:

some()方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试.我添加了一个函数,它只检查foo另一个数组中是否存在具有相同值的属性,以便能够从第一个数组进行过滤.

最后,您可以使用.map过滤掉所需的键值对

希望有道理

阅读更多关于.somefilter

  • 第一个数组应该只包含`foo`属性,所以OP也需要阅读`map` (2认同)

sja*_*han 9

这里只是一个小的解决方案filtermapfoo属性.

const myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
const mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];

const exclude = (arr1, arr2) => arr1.filter(o1 => arr2.map(o2 => o2.foo).indexOf(o1.foo) === -1);

console.log(exclude(myFirstObjArray, mySecondObjArray));
console.log(exclude(mySecondObjArray, myFirstObjArray));
Run Code Online (Sandbox Code Playgroud)