合并一个对象数组,其中一个 属性 相同,同时将另一个 属性 的唯一值传输到数组中
merge an array of objects where one property is the same, while transferring the unique values of another property into an array
我有一组对象,其中大多数属性可能彼此重复,但有一个值可能不同:
const originalArray = [
{ id: 1, name: 'x', 'description': 'x', url: 'y' },
{ id: 2, name: 'x', 'description': 'x', url: 'z' }
]
我想根据名称的差异对该数组进行重复数据删除,但将 URL 差异保留为已删除的数组中的数组:
const dedupedArray = [
{ id: 1, name: 'x', 'description': 'x', url: ['y','z'] },
]
function removeDuplicatesByProperty(keyFn, array) {
const mySet = new Set();
return array.filter(function (x) {
const key = keyFn(x),
isNew = !mySet.has(key);
if (isNew) mySet.add(key);
return isNew;
});
}
const dedupedArray = removeDuplicatesByProperty((x) => x.name, originalArray);
您可以使用 Array.reduce
:
const originalArray = [
{ id: 1, name: 'x', 'description': 'x', url: 'y' },
{ id: 2, name: 'x', 'description': 'x', url: 'z' }
]
const res = originalArray.reduce((a,b) => {
const found = a.find(e => e.name == b.name);
return found ? found.url.push(b.url) : a.push({...b, url:[b.url]}), a;
}, [])
console.log(res)
将数组缩减为 Map,并使用 mergeFn
合并重复项。使用 Array.from()
或 array spread:
将 Map.values()
迭代器转换回数组
const originalArray = [
{ id: 1, name: 'x', 'description': 'x', url: 'y' },
{ id: 2, name: 'x', 'description': 'x', url: 'z' }
]
const dedupeMerge = (keyFn, mergeFn, array) => Array.from(
array.reduce((acc, o) => {
const key = keyFn(o);
if(!acc.has(key)) return acc.set(key, o);
return acc.set(key, mergeFn(acc.get(key), o));
}, new Map()).values()
);
const dedupedArray = dedupeMerge(
x => x.name,
(o1, o2) => ({ ...o1, url: [o1.url, o2.url].flat() }),
originalArray
);
console.log(dedupedArray);
我有一组对象,其中大多数属性可能彼此重复,但有一个值可能不同:
const originalArray = [
{ id: 1, name: 'x', 'description': 'x', url: 'y' },
{ id: 2, name: 'x', 'description': 'x', url: 'z' }
]
我想根据名称的差异对该数组进行重复数据删除,但将 URL 差异保留为已删除的数组中的数组:
const dedupedArray = [
{ id: 1, name: 'x', 'description': 'x', url: ['y','z'] },
]
function removeDuplicatesByProperty(keyFn, array) {
const mySet = new Set();
return array.filter(function (x) {
const key = keyFn(x),
isNew = !mySet.has(key);
if (isNew) mySet.add(key);
return isNew;
});
}
const dedupedArray = removeDuplicatesByProperty((x) => x.name, originalArray);
您可以使用 Array.reduce
:
const originalArray = [
{ id: 1, name: 'x', 'description': 'x', url: 'y' },
{ id: 2, name: 'x', 'description': 'x', url: 'z' }
]
const res = originalArray.reduce((a,b) => {
const found = a.find(e => e.name == b.name);
return found ? found.url.push(b.url) : a.push({...b, url:[b.url]}), a;
}, [])
console.log(res)
将数组缩减为 Map,并使用 mergeFn
合并重复项。使用 Array.from()
或 array spread:
Map.values()
迭代器转换回数组
const originalArray = [
{ id: 1, name: 'x', 'description': 'x', url: 'y' },
{ id: 2, name: 'x', 'description': 'x', url: 'z' }
]
const dedupeMerge = (keyFn, mergeFn, array) => Array.from(
array.reduce((acc, o) => {
const key = keyFn(o);
if(!acc.has(key)) return acc.set(key, o);
return acc.set(key, mergeFn(acc.get(key), o));
}, new Map()).values()
);
const dedupedArray = dedupeMerge(
x => x.name,
(o1, o2) => ({ ...o1, url: [o1.url, o2.url].flat() }),
originalArray
);
console.log(dedupedArray);