javascript - 合并一个属性相同的对象数组,同时将另一个属性的唯一值转移到数组中
问题描述
我有一个对象数组,其中大多数属性可能彼此重复,但一个值可能不同:
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)
推荐阅读
- java - 如何在 JFR 中启用对象统计?
- python - Tkinter 对象没有属性“绑定”
- java - “mvn clean install”导致 Spring Boot 应用程序中出现空白 PDF 文档
- python - 如何在 pytorch 中为 DataLoader 提供图像和标签?
- processing - 3D 指挥棒圈围绕太阳移动
- lotus-notes - 编辑后创建两个保存选项
- mysql - 自 mysql 8.0.11 以来,如何解密 MySQL 密码
- spring - 静态路径 URL 没有优先于 RequestMapping URL
- android - 如何删除 GoogleSignIn 意图中的轻弹
- javascript - Passport-Twitter 回调没有被触发?