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。并且知道它们是如何工作的。但是理解您的代码很困难。但是通过您的解释,一切都变得简单了一点:)谢谢。