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

时间:2018-02-08 17:51:36

标签: javascript arrays

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

但是,我想知道我是否可以创建它的地图以及Map.ContainsKey或Map.getvalues();

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

(cartBody).empty

3 个答案:

答案 0 :(得分:1)

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

.as-console-wrapper { max-height: 100% !important; top: 0; }
$.ajax({
    type: 'POST',
    url: '/admin/menu',
    data: new FormData(this),
    processData: false,
    contentType: false,
    success: function (data) {
        console.log(data);
    },
    error: function(data) {
        console.error(data);
    }
});

答案 1 :(得分: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。换句话说,allItems数组末尾的项优先,因为Map构造函数中的后续条目会覆盖以前的条目。如果这些对象除了被比较的对象之外还有其他属性,这就很重要。
  2. 如果某些名称/国家组合包含:字符,则可能会发生碰撞。如果这成为一个问题,你可以对如何构建入口密钥感到高兴。
  3. Map在幕后使用哈希表,因此重复数据删除应该相当快。
  4. 按照设计,Map会记住输入顺序,因此最终数组将反映与allItems相同的顺序,但删除了重复项。对于不同的订单,您需要排序。

答案 2 :(得分:0)

使用 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'));

相关问题