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

问题描述 投票:0回答:1

我有两个数组

[
 { 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 }
]
javascript arrays node.js unique
1个回答
3
投票

一种方法是使用一种以日期为键的哈希映射,然后将这个映射转换为你想要的数据结构。

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);

0
投票

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

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


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)
© www.soinside.com 2019 - 2024. All rights reserved.