Javascript 从对象数组中删除相同的值

Javascript 从对象数组中删除相同的值,javascript,arrays,json,loops,javascript-objects,Javascript,Arrays,Json,Loops,Javascript Objects,我想通过比较两个数组从数组中删除相同的对象 样本数据: arr1 = [ {id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "c"}, {id: 4, name: "d"}, ]; arr2 = [ {id: 1, name: "a"}, {id: 4, name: "d"}, ]; let newArray = []; // new array with with no same values it shou

我想通过比较两个数组从数组中删除相同的对象

样本数据:

arr1 = [
  {id: 1, name: "a"},
  {id: 2, name: "b"},
  {id: 3, name: "c"},
  {id: 4, name: "d"},
];

arr2 = [
  {id: 1, name: "a"},
  {id: 4, name: "d"},
];

let newArray = []; // new array with with no same values it should be unique.
arr1.map((val, i)=>{
   arr2.map((val2)=>{
    if(val.id == val2.id){
       console.log('Matched At: '+ i) // do nothing
    }else{
      newArray.push(val);
    }
   })
})
console.log(newArray); // e.g: [{id: 2, name: "b"}, {id: 3, name: "c"},];

您可以使用方法更新代码,而不是使用
.map()
方法,如:

const arr1=[
{id:1,名称:“a”},
{id:2,名称:“b”},
{id:3,名称:“c”},
{id:4,名称:“d”},
],arr2=[
{id:1,名称:“a”},
{id:4,名称:“d”},
];
设newArray=[];//没有相同值的新数组应该是唯一的。
newArray=arr1.filter(函数(a){
对于(变量i=0;i
.as控制台包装{max height:100%!important;top:0;}
const isInArray=(arr,id,name)=>arr.reduce((result,curr)=>((curr.name==name&&curr.id==id)| result),false)
const newArray=arr1.reduce((结果,当前)=>(isInArray(arr2,当前id,当前名称)?结果:result.concat(当前)),[])

数组。过滤器
与非
数组组合。一些

这里的诀窍也是不要
一些

const arr1=[
{id:1,名称:“a”},
{id:2,名称:“b”},
{id:3,名称:“c”},
{id:4,名称:“d”},
],arr2=[
{id:1,名称:“a”},
{id:4,名称:“d”},
];
const newArray=arr1.filter(a=>!arr2.some(s=>s.id==a.id));
log(newArray)

.as console wrapper{max height:100%!important;top:0;}
使用检查第一个数组中的每个元素的
id
是否位于第二个数组中。如果元素不存在,则只产生它

const arr1=[
{id:1,名称:“a”},
{id:2,名称:“b”},
{id:3,名称:“c”},
{id:4,名称:“d”},
];
常数arr2=[
{id:1,名称:“a”},
{id:4,名称:“d”},
];
const result=arr1.filter(x=>!arr2.some(y=>y.id==x.id));

控制台日志(结果)我认为一个简单的比较器可以用来获取差异,然后对其进行分析。 使用这种方法,您不需要检查哪个数组更大

arr1=[{id:1,名称:“a”},{id:2,名称:“b”},{id:3,名称:“c”},{id:4,名称:“d”}];
arr2=[{id:1,名称:“a”},{id:4,名称:“d”},];
函数localComparer(b){
返回函数(a){
返回b.过滤器(
职能(项目){
return item.id==a.id&&item.name==a.name
}).长度==0;
}
}
var onlynarr1=arr1.filter(localComparer(arr2));
var onlynarr2=arr2.filter(localComparer(arr1));

console.log(onlynarr1.concat(onlynarr2))
我们可以通过检查当前数组中是否不包含
某些
元素来筛选值:

const result = arr1.reduce((a, c) => {
  if (!arr2.some(a2 => a2.id === c.id))
      a.push(c);
  return a;
}, [])
例如:

让arr1=[
{id:1,名称:“a”},
{id:2,名称:“b”},
{id:3,名称:“c”},
{id:4,名称:“d”},
];
设arr2=[
{id:1,名称:“a”},
{id:4,名称:“d”},
];
const result=arr1.reduce((a,c)=>{
如果(!arr2.some(a2=>a2.id==c.id))
a、 推(c);
返回a;
}, [])
控制台日志(结果)试试这个-

const arr1=[
{id:1,名称:“a”},
{id:2,名称:“b”},
{id:3,名称:“c”},
{id:4,名称:“d”},
];
常数arr2=[
{id:1,名称:“a”},
{id:4,名称:“d”},
];
常数arr3=[…arr1,…arr2];
const mySubArray=uq.uniq(arr3,'id');
console.log(mySubArray)

每个答案中都有如此多的循环

代码的复杂性我的答案是2N

这个想法是:

  • 合并数组

  • 第一个循环标记以某种方式重复

  • 第二个循环-过滤器重复输出

  • arr1=[
    {id:1,名称:“a”},
    {id:2,名称:“b”},
    {id:3,名称:“c”},
    {id:4,名称:“d”},
    ];
    arr2=[
    {id:1,名称:“a”},
    {id:4,名称:“d”},
    ];
    让newArray=[…arr1,…arr2].reduce((acc,item,index)=>{
    附件项目推送(项目);
    if(附件地图[item.id]的类型)!=='undefined'){
    acc.items[acc.map[item.id]]=null;
    附件项[索引]=空;
    }
    acc.map[项目id]=索引;
    返回acc
    },{map:{},items:[]}).items.filter(item=>!!item)
    
    log(newArray)这是否回答了您的问题?如果arr2包含一些要合并的唯一元素怎么办?例如
    arr2=[{id:1,name:“a”},{id:4,name:“d”},{id:5,name:“x”},]
    如果
    arr2
    包含一些要合并的唯一元素怎么办?@qiAlex你的意思是像一个唯一的合并?需要与OP确认这一点,对我来说,我将问题解释为返回一个不包含另一个数组的数组。首先,我理解了一个与您一样的问题,这是一个公平的假设,但是OP没有明确指定。也可以将一个问题理解为两个数组,应该转换为一个不包含重复项的数组,但理论上,
    arr1
    arr2
    都可以包含唯一项。@qiAlex您基本上可以用相同的方法执行,只需执行两次并加入即可。我将用此信息更新答案。在我的场景中,我在
    arr2
    中没有唯一的值,因此答案工作得很好。
    代码的复杂性我的答案是2N,
    很好,如果数据集变大,性能是个问题,那么这样做是个好主意。目前在这个小数据集上,它比一个简单的过滤器慢8倍&有些,但我不认为它需要更大的数据集才能变得更快。出于这个原因,我决定投这个票。我想如果性能真的很重要,您甚至可以通过检查长度来完成这两项工作:)