我有两个数组
[
{ 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)