繁体   English   中英

如何在删除重复项的同时合并对象数组

[英]How to merge arrays of objects while removing duplicates

我需要比较两个对象数组并删除重复项并将它们合并为一个。 我对 javascript/Typescript 有点陌生。 我已经阅读了一些使用 Map、reduce、filter 来完成这项工作的博客。 这是正确的方法吗?

但是,我想知道是否可以创建它和 Map.ContainsKey 或 Map.getvalues() 的映射;

在实际问题中,对象非常庞大,有几个键,甚至数组有数百条记录。

   [
    {
        Name: Roger
        Country : spain
    },
    {
        Name:Tiger
        Counry : USA
    },
    {
        Name: Micheal
        Country: USA
    },
]


[
    {
        Name: sachin
        Country : India
    },
    {
        Name:Roger
        Counry : Spain
    },
]

output 

[
    {
        Name: Roger
        Country : spain
    },
    {
        Name:Tiger
        Counry : USA
    },
    {
        Name: Micheal
        Country: USA
    },
    {
        Name: sachin
        Country : India
    }
]

您可以将所需值的哈希表作为键,并在哈希表中推送没有标志的元素。

 var array1 = [{ Name: 'Roger', Country: 'Spain' }, { Name: 'Tiger', Counry: 'USA' }, { Name: 'Micheal', Country: 'USA' }], array2 = [{ Name: 'sachin', Country: 'India' }, { Name: 'Roger', Country: 'Spain' }], hash = Object.create(null), result = [array1, array2].reduce(function (r, a) { a.forEach(function (o) { var key = ['Name', 'Country'].map(k => o[k]).join('|'); if (!hash[key]) { r.push(o); hash[key] = true; } }); return r; }, []); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

这是一种可能的解决方案:

// Step 1, concat the two arrays together.
const allItems = items1.concat(items2);

// Step 2, map the above into an array of key/value entries.
const entries = allItems.map(o => [`${o.Name}:${o.Country}`, o]);

// Step 3, create a Map on the entries. De-duping happens here.
const map = new Map(entries);

// Step 4, extract the map's values back into an array.
const result = [...map.values()];

有关此方法的一些注意事项:

  1. 在步骤1的concat()中,顺序很重要! items2 items1优先于items2 换句话说, allItems数组末尾的项目具有优先权,因为Map构造函数中的后续条目会覆盖先前的条目。 如果这些对象除了要比较的对象之外还具有其他属性,则这很重要。
  2. 如果某些名称/国家/地区组合包含:字符,则很可能会发生冲突。 如果这成为问题,那么您可以幻想如何构建输入键。
  3. Map在后台使用哈希表,因此重复数据删除应该相当快。
  4. 根据设计, Map记住输入顺序,因此最终数组将反映与allItems相同的顺序,但删除了重复项。 对于其他订单,您需要进行排序。

使用map()filter()方法的基于 Es6 的解决方案。

合并两个对象数组并创建一个删除重复对象

 let arr1 = [ { Name: 'Roger', Country : 'spain' }, { Name:'Tiger', Country : 'USA' }, { Name: 'Micheal', Country: 'USA' }, ]; let arr2 = [ { Name: 'sachin', Country : 'India' }, { Name:'Roger', Country : 'Spain' }, ] let arr3 = [...arr1, ...arr2] function mergeUniqueArray(arr, comp) { let unique = arr .map(item => item[comp]) // store the keys of the unique objects .map((item, i, final) => final.indexOf(item) === i && i) // eliminate the duplicate keys & store unique objects .filter(item => arr[item]).map(item => arr[item]); return unique; } console.log(mergeUniqueArray(arr3,'Name'));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM