Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript从对象数组中获取不在另一个数组中的元素_Javascript_Arrays_Javascript Objects - Fatal编程技术网

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

JavaScript从对象数组中获取不在另一个数组中的元素,javascript,arrays,javascript-objects,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}]; 我需要得到两个单独的数组,其中包含keyfoo的值,第一个数组根据keyfoo的值包含在第一个数组中但不在第二个数组中的值,第二个数组位于mySecondObjArray中但不在m

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

myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];
我需要得到两个单独的数组,其中包含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}

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

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));
log(firstArray.map(o=>{return{'foo':o.foo}}))

log(secondArray.map(o=>{return{'foo':o.foo}}))
您可以通过查找进行筛选

const unique=a=>o=>!a、 一些({foo}=>o.foo===foo);
var first=[{foo:1,bar:1},{foo:3,bar:3},{foo:4,bar:5}],
第二个=[{foo:2},{foo:4},{foo:5}],
uniqueFirst=first.filter(unique(second)),
uniqueSecond=second.filter(unique(first));
console.log(uniqueFirst);
console.log(唯一秒)

。作为控制台包装{max height:100%!important;top:0;}
您可以创建一个可重用函数来防止代码重复。只需切换到函数参数。还要注意的是,对于
循环,内部循环是简单的
,因此我们可以使用
中断
,避免不必要的检查

var firstArray=[];
var secondArray=[];
var myFirstObjArray=[{foo:1,bar:1},{foo:3,bar:3},{foo:4,bar:5}];
var mySecondObjArray=[{foo:2},{foo:4},{foo:5}];
函数差异(myFirstObjArray、mySecondObjArray){
var firstArray=[];
myFirstObjArray.forEach((obj)=>{
var匹配=假;

对于(var i=0;i这里有一个小的解决方案,它只包含
过滤器
映射
,并带有
foo
属性

constmyfirstobjarray=[{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);
log(排除(myFirstObjArray、mySecondObjArray));

log(排除(mySecondObjArray,myFirstObjArray));
ES5不使用fat箭头

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){return!mySecondObjArray.some(函数(i){return i.foo==o.foo});
secondArray=mySecondObjArray.filter(函数(o){return!myFirstObjArray.some(函数(i){return i.foo==o.foo});
console.log(firstArray)

console.log(secondArray)
添加您的预期输出here@GeorgeBailey更新我的question@Dana:我在ES5中添加了答案,以支持所有浏览器,包括在大多数语言中可能重复的IEF。这被称为类似于“array diff”的东西。第一个数组应仅包含
foo
属性,因此OP可能需要阅读
map
too不提供预期的输出首选
包含
indefOf
firstArray = [{foo: 1}, {foo: 3}];
secondArray = [{foo: 2}, {foo: 5}];