【问题标题】:merge an array of objects where one property is the same, while transferring the unique values of another property into an array合并一个属性相同的对象数组,同时将另一个属性的唯一值转移到数组中
【发布时间】:2021-12-04 00:48:26
【问题描述】:

我有一个对象数组,其中大多数属性可能彼此重复,但一个值可能不同:

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);

【问题讨论】:

标签: javascript arrays merge set


【解决方案1】:

你可以使用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)

【讨论】:

    【解决方案2】:

    将数组简化为 Map,并使用 mergeFn 合并重复项。使用Array.from() 或数组展开将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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2016-04-20
      • 2018-04-08
      • 1970-01-01
      • 2012-04-03
      • 2021-07-24
      • 1970-01-01
      相关资源
      最近更新 更多