Javascript 获取对象数组中重复对象的列表

Javascript 获取对象数组中重复对象的列表,javascript,arrays,typescript,ecmascript-6,lodash,Javascript,Arrays,Typescript,Ecmascript 6,Lodash,我试图在对象数组中获取重复的对象。假设对象如下所示 values = [ { id: 10, name: 'someName1' }, { id: 10, name: 'someName2' }, { id: 11, name: 'someName3' }, { id: 12, name: 'someName4' } ]; 重复对象应返回如下所示: duplicate = [ { id: 10, name: 'someName1' }, { id: 10, name:

我试图在对象数组中获取重复的对象。假设对象如下所示

values = [
  { id: 10, name: 'someName1' },
  { id: 10, name: 'someName2' },
  { id: 11, name: 'someName3' },
  { id: 12, name: 'someName4' }
];
重复对象应返回如下所示:

duplicate = [
  { id: 10, name: 'someName1' },
  { id: 10, name: 'someName2' }
];
试试这个

function checkDuplicateInObject(propertyName, inputArray) {
  var seenDuplicate = false,
  testObject = {};

  inputArray.map(function(item) {
  var itemPropertyName = item[propertyName];    
  if (itemPropertyName in testObject) {
  testObject[itemPropertyName].duplicate = true;
  item.duplicate = true;
  seenDuplicate = true;
 }
 else {
   testObject[itemPropertyName] = item;
   delete item.duplicate;
 }
});

 return seenDuplicate;
}
引用自:

您可以使用根据
id
键创建计数器查找表,然后使用删除查找表中仅出现一次的任何项目。时间复杂度为O(n)

const values=[{id:10,name:'someName1'},{id:10,name:'someName2'},{id:11,name:'someName3'},{id:12,name:'someName4'}];
常量查找=值。减少((a,e)=>{
a[e.id]=++a[e.id]| | 0;
返回a;
}, {});

log(values.filter(e=>lookup[e.id])您可以使用数组来存储唯一的元素,并对值使用筛选器来仅返回重复项

const unique = []

const duplicates = values.filter(o => {

   if(unique.find(i => i.id === o.id && i.name === o.name)) {
     return true
   }

   unique.push(o)
   return false;
})

您还没有澄清两个ID不同但“名称”相同的对象是否算作重复。我假设这些不算重复;换句话说,只有具有相同id的对象才会被视为重复对象

let ids = {};
let dups = [];

values.forEach((val)=> {
  if (ids[val.id]) {
    // we have already found this same id
    dups.push(val)
  } else {
    ids[val.id] = true;
  }
})
return dups;
使用lodash,您可以根据元素的
id
对元素进行分组。比那些少于两名成员的小组,结果是:

const values=[{id:10,name:'someName1'},{id:10,name:'someName2'},{id:11,name:'someName3'},{id:12,name:'someName4'}];
const result=\流([
arr=>\uu0.groupBy(arr,'id'),//按id对元素进行分组
g=>\u0.filter(g,o=>o.length>1),//删除成员少于两个的组
_.flant//将结果展平到单个数组
])(价值观);
控制台日志(结果)

使用lodash,您可以解决这一问题,并考虑到
O(n)
的复杂性:

const data=[{id:10,name:'someName1'},{id:10,name:'someName2'},{id:11,name:'someName3'},{id:12,name:'someName4'}]
常量计数=u.countBy(数据'id')
console.log(u.filter(数据,x=>counts[x.id]>1))
假设您有:

arr = [
    { id:10, name: 'someName1' },
    { id:10, name: 'someName2' },
    { id:11, name: 'someName3' },
    { id:12, name: 'someName4' }
]
因此,要获得独特的项目:

unique = arr
     .map(e => e['id'])
     .map((e, i, final) => final.indexOf(e) === i && i)
     .filter(obj=> arr[obj])
     .map(e => arr[e]);
然后,结果将是

unique = [
     { id:10, name: 'someName1' },
     { id:11, name: 'someName3' },
     { id:12, name: 'someName4' }
]
要获得重复的ID,请执行以下操作:

duplicateIds = arr
     .map(e => e['id'])
     .map((e, i, final) => final.indexOf(e) !== i && i)
     .filter(obj=> arr[obj])
     .map(e => arr[e]["id"])
ID列表将被删除

duplicateIds = [10]
因此,要获取重复的对象:

duplicate = arr.filter(obj=> dublicateIds.includes(obj.id));
现在你有了它:

duplicate = [
    { id:10, name: 'someName1' },
    { id:10, name: 'someName2' }
]

谢谢

您的问题是什么?如何尝试?您还没有向我们展示任何试图解决此问题的代码。对重复数组的web搜索应该为您提供了一个良好的起点。您能解释一下您的代码吗?我感到困惑。您的代码中没有任何平等性。这是如何工作的?为什么
A
在每次迭代中都显示相同的对象?我需要对您的代码进行详细分析。我建议您查看
reduce
的文档
过滤器
如果您还没有。我使用
reduce
构建每个对象的
id
到其
出现次数计数的对象映射-1
a
是累加器对象,它由
reduce
从一个回调传递到下一个回调<代码>过滤器
使用
查找[e.id]
的真实性来确定元素是否唯一。如果查找条目为0(错误),则只会看到一次,并且
filter
会从结果集中忽略它,否则会保留它。事实上,我知道reduce(不是专家,但知道)和filter。并且知道它们是如何工作的。但是理解您的代码很困难。但是通过您的解释,一切都变得简单了一点:)谢谢。