首页 > 解决方案 > 如何组合两个对象数组并删除在 IE11 中兼容的 javascript 中的重复对象

问题描述

我有 2 个具有以下结构的对象数组:

array1 = [
  {
    categoryID: 'C1',
    links: [
      (0: {
        id: 1,
        linkID: 'A',
      }),
      (1: {
        id: 2,
        linkID: 'B',
      }),
    ],
  },
  {
    categoryID: 'C2',
    links: [
      (0: {
        id: 1,
        linkID: 'C',
      }),
      (1: {
        id: 2,
        linkID: 'D',
      }),
    ],
  },
];

array2 = [
  {
    categoryID: 'C1',
    links: [
      (0: {
        id: 1,
        linkID: 'A',
      }),
      (1: {
        id: 2,
        linkID: 'E',
      }),
    ],
  },
  {
    categoryID: 'C3',
    links: [
      (0: {
        id: 1,
        linkID: 'F',
      }),
    ],
  },
];

我希望我的结果如下所示,因为两个数组都categoryID : 'C1'应该合并为一个categoryID : 'C1',并且重复的 links[] 项应该合并在这一类别中。例如:linkID : "A'在两个数组中都很常见,因此应该合并:

[
  {
    categoryID: 'C1',
    links: [
      (0: {
        id: 1,
        linkID: 'A',
      }),
      (1: {
        id: 2,
        linkID: 'B',
      }),
      (3: {
        id: 3,
        linkID: 'E',
      }),
    ],
  },
  {
    categoryID: 'C2',
    links: [
      (0: {
        id: 1,
        linkID: 'C',
      }),
      (1: {
        id: 2,
        linkID: 'D',
      }),
    ],
  },
  {
    categoryID: 'C3',
    links: [
      (0: {
        id: 1,
        linkID: 'F',
      }),
    ],
  },
];

请帮助我提供与 IE-11 或更低 IE 版本兼容的 javascript 代码。

我已经尝试过.map().reduce()但要么这些在 IE11 中不兼容,要么我做错了什么。

标签: javascriptinternet-explorer-11

解决方案


首先按原样连接两个数组。然后将数组转换为普通对象(散列),其中键是应该唯一的字符串(categoryID、linkID)。这将删除重复项。然后转换回数组结构。

这适用于 Internet Explorer 11(已测试):

var array1 = [{ categoryID : "C1", links : [{ id : 1, linkID : "A" }, { id : 2, linkID : "B" }]}, {categoryID : "C2", links : [{ id : 1, linkID : "C" }, { id : 2, linkID : "D" }] }];
var array2 = [{ categoryID : "C1", links : [{ id : 1, linkID : "A" }, { id : 2, linkID : "E" }]}, {categoryID : "C3", links : [{ id : 1, linkID : "F" }] }];

var hash = array1.concat(array2).reduce(function (acc, o) {
    acc[o.categoryID] = acc[o.categoryID] || {};
    o.links.forEach(function (link) {
        acc[o.categoryID][link.linkID] = 1;
    });
    return acc;
}, {});

var result = Object.keys(hash).map(function (cat) {
    return { 
        categoryID: cat, 
        links: Object.keys(hash[cat]).map(function (link, i) {
            return { id: i+1, linkID: link };
        })
    };
});

console.log(result);


推荐阅读