ua_*_*oaz 2 javascript arrays typescript ecmascript-6 lodash
我正在尝试在对象数组中获取重复的对象。假设对象如下所示。
values = [
{ id: 10, name: 'someName1' },
{ id: 10, name: 'someName2' },
{ id: 11, name: 'someName3' },
{ id: 12, name: 'someName4' }
];
Run Code Online (Sandbox Code Playgroud)
重复的对象应返回如下:
duplicate = [
{ id: 10, name: 'someName1' },
{ id: 10, name: 'someName2' }
];
Run Code Online (Sandbox Code Playgroud)
HMa*_*gdy 11
假设你有:
arr = [
{ id:10, name: 'someName1' },
{ id:10, name: 'someName2' },
{ id:11, name: 'someName3' },
{ id:12, name: 'someName4' }
]
Run Code Online (Sandbox Code Playgroud)
因此,要获得独特的物品:
unique = arr
.map(e => e['id'])
.map((e, i, final) => final.indexOf(e) === i && i)
.filter(obj=> arr[obj])
.map(e => arr[e]);
Run Code Online (Sandbox Code Playgroud)
然后,结果将是
unique = [
{ id:10, name: 'someName1' },
{ id:11, name: 'someName3' },
{ id:12, name: 'someName4' }
]
Run Code Online (Sandbox Code Playgroud)
并且,要获取重复的 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"])
Run Code Online (Sandbox Code Playgroud)
ID 列表将是
duplicateIds = [10]
Run Code Online (Sandbox Code Playgroud)
因此,要获取重复的对象:
duplicate = arr.filter(obj=> dublicateIds.includes(obj.id));
Run Code Online (Sandbox Code Playgroud)
现在你拥有了:
duplicate = [
{ id:10, name: 'someName1' },
{ id:10, name: 'someName2' }
]
Run Code Online (Sandbox Code Playgroud)
谢谢https://reactgo.com/removeduplicateobjects/
使用 lodash,您可以通过filter和countBy的复杂性来解决这个问题O(n):
const data = [{ id: 10,name: 'someName1' }, { id: 10,name: 'someName2' }, { id: 11,name: 'someName3' }, { id: 12,name: 'someName4' } ]
const counts = _.countBy(data, 'id')
console.log(_.filter(data, x => counts[x.id] > 1))Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>Run Code Online (Sandbox Code Playgroud)
你可以用 ES6 做同样的事情,如下所示:
const data = [{ id: 10,name: 'someName1' }, { id: 10,name: 'someName2' }, { id: 11,name: 'someName3' }, { id: 12,name: 'someName4' } ]
const countBy = (d, id) => d.reduce((r,{id},i,a) => (r[id] = a.filter(x => x.id == id).length, r),{})
const counts = countBy(data, 'id')
console.log(data.filter(x => [x.id] > 1))Run Code Online (Sandbox Code Playgroud)
您还没有澄清两个具有不同 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;
Run Code Online (Sandbox Code Playgroud)
您可以用来Array#reduce基于id密钥创建一个计数器查找表,然后用于Array#filter删除在查找表中仅出现一次的所有项目。时间复杂度为O(n)。
const values = [{id: 10, name: 'someName1'}, {id: 10, name: 'someName2'}, {id: 11, name:'someName3'}, {id: 12, name: 'someName4'}];
const lookup = values.reduce((a, e) => {
a[e.id] = ++a[e.id] || 0;
return a;
}, {});
console.log(values.filter(e => lookup[e.id]));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4970 次 |
| 最近记录: |