首页 > 解决方案 > 合并和连接两个对象数组 - JS

问题描述

我有两个对象数组,我想根据不同的属性合并它们,如果列表中不存在某些东西,我也想合并它们。

这就是我所拥有的:

const data1 = [{
  name: 'A',
  id: 1
}, {
  name: 'B',
  id: 2
}]

const data2 = [{
  city: 'X',
  rowID: 1
}, {
  city: 'Y',
  rowID: 2
}, {
  city: 'Z',
  rowID: 3
}]

const result = _.map(data1, function(p) {
  return _.merge(
    p,
    _.find(data2, {
      rowID: p.id
    })
  )
})

console.log(result)

//Expected Result
/**[
  {
    "name": "A",
    "id": 1,
    "city": "X",
    "rowID": 1
  },
  {
    "name": "B",
    "id": 2,
    "city": "Y",
    "rowID": 2
  },
  {
    "name": "",
    "id": "",
    "city": 'Z',
    "rowID": 3
  }
]*/
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>

请指教。

标签: javascriptarrayslodash

解决方案


您可以使用 a 收集合并的对象Map并获取值。

const
    merge = data => {
        const
            pattern = {},
            map = new Map;

        data.forEach(([objects, key]) => {
            Object.keys(objects[0]).forEach(k => pattern[k] = '');
            objects.forEach(o => map.set(o[key], { ...map.get(o[key]), ...o }));
        });
        return Array.from(map.values(), o => ({ ...pattern, ...o }));
    },
    data1 = [{ name: 'A', id: 1 }, { name: 'B', id: 2 }],
    data2 = [{ city: 'X', rowID: 1 }, { city: 'Y', rowID: 2 }, { city: 'Z', rowID: 3 }],
    result = merge([[data1, 'id'], [data2, 'rwoID']]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读