如何合并具有唯一值的对象数组

How to merge array of objects with unique value

我有两个数组

[
 { date: '2020-05', visits: 0 },
 { date: '2020-04', visits: 0 },
 { date: '2020-03', visits: 0 },
   ....
   ....
 { date: '2019-07', visits: 0 },
 { date: '2019-06', visits: 0 }
]

[
 { date: '2019-08', visits: 47 },
 { date: '2019-09', visits: 120 },
 { date: '2019-10', visits: 69 },
 { date: '2019-12', visits: 1 },
 { date: '2020-01', visits: 378 },
 { date: '2020-02', visits: 355 }
]

我需要合并这些具有唯一日期的数组吗? 合并前两个数组以获得某个日期的唯一访问 需要用访问“0”来填充缺失的日期。

预期结果是

[
 { date: '2020-05', visits: 0 },
 { date: '2020-04', visits: 0 },
 { date: '2020-03', visits: 0 },
 { date: '2020-02', visits: 355 }
 { date: '2020-01', visits: 378 },
 { date: '2019-12', visits: 1 },
 { date: '2019-11', visits: 0 },
 { date: '2019-10', visits: 69 },
 { date: '2019-09', visits: 120 },
 { date: '2019-08', visits: 47 },
 { date: '2019-07', visits: 0 },
 { date: '2019-06', visits: 0 }
]

一种方法是使用一种以日期为键的哈希映射,然后将此映射转换为所需的数据结构:

const arr1 = [
 { date: '2019-08', visits: 5 },
 { date: '2019-09', visits: 5 },
 { date: '2019-10', visits: 5 },
 { date: '2019-12', visits: 5 },
 { date: '2020-01', visits: 5 },
 { date: '2020-02', visits: 5 }
];

const arr2 = [
 { date: '2019-08', visits: 5 },
 { date: '2019-09', visits: 5 },
 { date: '2019-10', visits: 5 },
 { date: '2019-12', visits: 5 },
 { date: '2020-01', visits: 5 },
 { date: '2020-05', visits: 5 }
];

const map = [...arr1, ...arr2].reduce((acc, cur) => {
  if (!acc[cur.date]) {
    acc[cur.date] = cur.visits;
  } else {
    acc[cur.date] += cur.visits;
  }
  return acc;
}, {});

const results = Object.entries(map).map(([key, value]) => ({ date: key, visits: value }));
// even cleaner: const results = Object.entries(map).map(([date, visits]) => ({ date, visits }));
console.log(results);

[...arr1, ...arr2] 合并数组,如果您有所有日期(即使访问次数为零,也应该是全部。

如果你没有所有的日期,我会在数组中制作一个日期映射,转换为 Date 类型并找到最小和最大日期,然后只需添加 24h 进行循环并将 Date 转换回字符串,并将缺失的日期添加到值为 0 的数组中。

试试这个

const moment = require('moment');

let a  = [
    { date: '2020-05', visits: 0 },
    { date: '2020-04', visits: 0 },
    { date: '2020-03', visits: 0 },
    { date: '2019-07', visits: 0 },
    { date: '2019-06', visits: 0 },
    { date: '2019-08', visits: 3 }
];

let b = [
    { date: '2019-08', visits: 47 },
    { date: '2019-09', visits: 120 },
    { date: '2019-10', visits: 69 },
    { date: '2019-12', visits: 1 },
    { date: '2020-01', visits: 378 },
    { date: '2020-02', visits: 355 }
];

const merge = (a, b) => {
    [a, b] = a.length > b.length ? [[...a], [...b]] : [[...b], [...a]];
    a.forEach((x) => {
        let index = b.findIndex(y => (moment(y.date).isSame(moment(x.date))));
        if (index > -1) {
            b[index].visits += x.visits;
        } else {
            b.push(x);
        }
    });
    return b;
};

let c = merge(a, b);

console.log(a);
console.log(b);
console.log(c)