首页 > 解决方案 > 在 javascript 地图中创建复合对象

问题描述

试图在地图中创建一个复合对象但卡在一个点上。映射具有开始和结束时间以及一些事件的数组。下面是代码。

let detailsRes = Object.create({});

response.map((res, i) => {
    let start = new Date(moment(res.startTime).format('L'));
    let end = new Date(moment(res.endTime).format('L'));
    let current = new Date(start);
    while (current <= end) {
      date = [new Date(current).getFullYear(), new Date(current).getMonth() + 1, new Date(current).getDate()].join('-');
      detailsRes[date] == undefined ? (detailsRes[date] = 1) : (detailsRes[date] += 1);
      var newDate = current.setDate(current.getDate() + 1);
      current = new Date(newDate);
    }
  });

样本数据

[{
    "endTime": "2020-12-06 16:30:00.000Z",
    "event": "Study",
    "startTime": "2020-12-06 12:30:00.000Z",
    'somedata':'js is good'
  },
  {
    "endTime": "2020-12-06 16:30:00.000Z",
    "event": "gym",
    "startTime": "2020-12-05 12:30:00.000Z",
    'somedata':'js is good'
  },
]

电流输出

  {5-12-2020 : 1, 6-12-2020 : 2 },

预期产出

5-12-2020 : {
    totalcount: 1,  // 5 is only 1 time
    event1: 1 //gym
  },
  6-12-2020 : {
    totalcount:2,  // 2 times 6-12 is there so count is 2
    event1: 1, //gym
    event2: 1 // study
  }

所以基本上检查日期之间发生了多少事件,如果事件在 1-12 到 3-12 之间,那么每个日期的单个对象为 1,2,3 和总数为 1,如果中间有任何其他事件,则增加该特定事件总数。上面给出的我的输出是正确的,但试图修改像预期输出一样的对象。所以我需要这种对象。

标签: javascriptarraysjsonobject

解决方案


您的要求并不完全清楚,但可以肯定的是您不应该reduce为此map使用。

使结果成为对象很容易,见下文,但我仍然不完全清楚如何eventN正确构建密钥。这当然适用于您在此处介绍的测试用例,如果它不适用于您想要澄清的内容,我会根据需要进行更新。

var response = [{
    "endTime": "2020-12-06 16:30:00.000Z",
    "event": "Study",
    "startTime": "2020-12-06 12:30:00.000Z",
    'somedata':'js is good'
  },
  {
    "endTime": "2020-12-06 16:30:00.000Z",
    "event": "gym",
    "startTime": "2020-12-05 12:30:00.000Z",
    'somedata':'js is good'
  },
]

let detailsRes = response.reduce((acc, res) => {
    let start = new Date(moment(res.startTime).format('L'));
    let end = new Date(moment(res.endTime).format('L'));
    let current = new Date(start);
    var n = 0;
    while (current <= end) {
      date = [new Date(current).getFullYear(), new Date(current).getMonth() + 1, new Date(current).getDate()].join('-');
      if(acc[date] == undefined) acc[date] = {totalcount:0}
      acc[date].totalcount++;
      acc[date]["event" + ++n] = 1;
      var newDate = current.setDate(current.getDate() + 1);
      current = new Date(newDate);
    }
    return acc
  }, {});
  
console.log(detailsRes)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>


推荐阅读