【问题标题】:How to merge array of objects with unique value如何合并具有唯一值的对象数组
【发布时间】:2020-05-19 06:57:23
【问题描述】:

我有两个数组

[
 { 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】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      试试这个

      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)

      【讨论】:

        猜你喜欢
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多