如何合并具有唯一值的对象数组
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)
我有两个数组
[
{ 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)