Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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:从2个数组中查找不匹配的对象_Javascript_Arrays_Object - Fatal编程技术网

Javascript:从2个数组中查找不匹配的对象

Javascript:从2个数组中查找不匹配的对象,javascript,arrays,object,Javascript,Arrays,Object,我有两个对象数组 var arr1 = [{id: "145", firstname: "dave", lastname: "jones"}, {id: "135", firstname: "mike",lastname: "williams"}, {id: "148", firstname: "bob",lastname: "michaels"}]; var arr2 = [{id: "146", firstname: "dave", lastn

我有两个对象数组

var arr1 = [{id: "145", firstname: "dave", lastname: "jones"},
            {id: "135", firstname: "mike",lastname: "williams"},
            {id: "148", firstname: "bob",lastname: "michaels"}];
var arr2 = [{id: "146", firstname: "dave", lastname: "jones"},
            {id: "135", firstname: "mike", lastname: "williams"},
            {id: "148", firstname: "bob", lastname: "michaels"}];
我想找到id仅存在于其中一个数组中的对象,并将该对象记录到控制台或将该对象推送到新数组中

所以我想以

var arr1 = [{id: "145", firstname: "dave", lastname: "jones"}]
var arr2 = [{id: "146", firstname: "dave", lastname: "jones"}]
我尝试使用forEach循环并将匹配的id从数组中剪接出来

arr1.forEach(function(element1, index1) {
                let arr1Id = element1.id;
                arr2.forEach(function(element2, index2) {
                    if (arr1Id === element2.id) {
                        arr1.splice(element1, index1)
                        arr2.splice(element2, index2)

                };
            });
        });


console.log(arr1);
console.log(arr2);
但我最终还是

arr1

arr2

您可以为每个数组的
id
取一个值,并通过检查是否存在来过滤另一个数组

var array1=[{id:“145”,firstname:“dave”,lastname:“jones”},{id:“135”,firstname:“mike”,lastname:“williams”},{id:“148”,firstname:“bob”,lastname:“michaels”},
array2=[{id:“146”,名字:“dave”,名字:“jones”},{id:“135”,名字:“mike”,名字:“williams”},{id:“148”,名字:“bob”,名字:“michaels”},
set1=新集合(array1.map(({id})=>id)),
set2=新集合(array2.map(({id})=>id)),
result1=array1.filter(({id})=>!set2.has(id)),
result2=array2.filter(({id})=>!set1.has(id));
console.log(result1);
console.log(result2)
。作为控制台包装{最大高度:100%!重要;顶部:0;}
只需使用
!数组.prototype.filter()中的arr.some()

const arr1=[{id:“145”,firstname:“dave”,lastname:“jones”},{id:“135”,firstname:“mike”,lastname:“williams”},{id:“148”,firstname:“bob”,lastname:“michaels”},
arr2=[{id:“146”,firstname:“dave”,lastname:“jones”},{id:“135”,firstname:“mike”,lastname:“williams”},{id:“148”,firstname:“bob”,lastname:“michaels”}],
newArr1=arr1.filter(x=>!arr2.some(y=>y.id==x.id)),
newArr2=arr2.filter(x=>!arr1.some(y=>y.id==x.id));

console.log(newArr1,newArr2)您好,请尝试使用筛选器和findindex的组合,如下面的代码片段,并让我知道。
var arr1=[{id:“145”,姓:“戴夫”,姓:“琼斯”},
{id:“135”,姓:“迈克”,姓:“威廉姆斯”},
{id:“148”,姓:“鲍勃”,姓:“迈克尔”};
var arr2=[{id:“146”,姓:“戴夫”,姓:“琼斯”},
{id:“135”,姓:“迈克”,姓:“威廉姆斯”},
{id:“148”,姓:“鲍勃”,姓:“迈克尔”};
让unmatchedArr1=arr1.filter(元素=>{
让targetIndex=arr2.findIndex(e=>element.id==e.id);
返回targetIndex>=0?false:true;
})
让unmatchedArr2=arr2.filter(元素=>{
让targetIndex=arr1.findIndex(e=>element.id==e.id);
返回targetIndex>=0?false:true;
})
console.log(不匹配的1);

console.log(不匹配的r2)使用
Array.filter
,它被设计用来做这种工作。我会传递一个匹配2个id的函数吗?现在有一些答案显示了如何做。但是回答你的问题,不,你应该传递一个函数,接受类型为
{id:string,firstname:string,lastname:string}
的对象,并返回
true
(keep)或
false
(exclude)。当一个简单的
,这看起来非常开销大!arr.some()
完成了这项工作。从大o的意义上讲,它只具有线性复杂性。我指的是编码风格。我不会让那个代码在审查中通过。@NinaScholz做
Set
保证
O(n)
?我认为它是
O(nlog(n))
direct
arr。无论如何,有些()
可能不会更好。
[ { id: '135', firstname: 'mike', lastname: 'williams' },
  { id: '148', firstname: 'bob', lastname: 'michaels' } ]
 [ { id: '135', firstname: 'mike', lastname: 'williams' },
  { id: '148', firstname: 'bob', lastname: 'michaels' } ]