首页 > 解决方案 > 从“当前时间”开始计算具有最近几天、几周和几个月的时间戳的对象(在数组中)

问题描述

我有一个带有时间戳作为属性的对象数组:

样本输入:

const data = [
  {
    _id: "602102db3acc4515d4b2f687",
    createdDt: "2021-02-08T09:22:35.000Z",
  },
  {
    _id: "6021024da706a260d8932da2",
    createdDt: "2021-02-08T09:20:13.000Z",
  },
  // ...
  // ...
  {
    _id: "6020fd863acc4515d4b2f685",
    createdDt: "2021-02-08T08:59:50.000Z",
  },
];

现在从当前日期开始,我需要具有今天前一天等时间戳的对象总数如果前一天没有条目,则计数可以为零)。

同样,我需要今天、前一天等的计数,周和月也一样。

例如,我期望的输出可能是:

样本输出:

const result = {
  days: [0, 0, 5, 10, ...],
  weeks: [15, 5, 8, 0, ...],
  months: [30, 42, 33, 23, ...]
}

我正在使用 ES6、Lodash 和 moment.js。这是用于基本图形表示。


更新:

这是我写的代码,有人可以提出一个更简单的解决方案吗?

我目前的解决方案:

for (var i = 0, k = 1; i < 365; i++, k++) {
  let dt = moment().subtract(i, "days");
  let td = moment().subtract(k, "days");
  builddays.push(0);
  for (var j = 0; j < drivers.length; j++) {
    let ddt = new Date(drivers[j].createdDt);
    if (moment(ddt).isBetween(td, dt)) builddays[i] = drivers[j].count;
  }
}

var weeksbifurcate = builddays.reduce((resultArray, item, index) => {
  const chunkIndex = Math.floor(index / 7);

  if (!resultArray[chunkIndex]) {
    resultArray[chunkIndex] = [];
  }

  resultArray[chunkIndex].push(item);

  return resultArray;
}, []);

var monthsbifurcate = builddays.reduce((resultArray, item, index) => {
  const chunkIndex = Math.floor(index / 30);

  if (!resultArray[chunkIndex]) {
    resultArray[chunkIndex] = [];
  }

  resultArray[chunkIndex].push(item);

  return resultArray;
}, []);

for (i = 0; i < 12; i++) {
  days.push(builddays[i]);
  weeks.push(weeksbifurcate[i].reduce(getSum, 0));
  months.push(monthsbifurcate[i].reduce(getSum, 0));
}

标签: javascriptnode.jsreactjsmomentjslodash

解决方案


使用moment # diff来查找索引,即dayIndex, weekIndex,并在对应的 in对象中monthIndex放置或增加右边:indexarrayresult

const solve = (data) => {
  const result = {
    days: [],
    weeks: [],
    months: [],
  };
  data.forEach((item) => {
    const today = moment();
    const createdDt = moment(item.createdDt);

    const dayIndex = today.diff(createdDt, "days");
    const weekIndex = today.diff(createdDt, "weeks");
    const monthIndex = today.diff(createdDt, "months");

    result.days[dayIndex] = (result.days[dayIndex] || 0) + 1;
    result.weeks[weekIndex] = (result.weeks[weekIndex] || 0) + 1;
    result.months[monthIndex] = (result.months[monthIndex] || 0) + 1;
  });
  return result;
};

const data = [
  {createdDt: "2021-03-03T00:00:00.000Z",},
  {createdDt: "2021-03-03T00:00:00.000Z",},
  {createdDt: "2021-03-01T00:00:00.000Z",},
  {createdDt: "2021-02-28T00:00:00.000Z",},
  {createdDt: "2021-02-27T00:00:00.000Z",},
  {createdDt: "2021-02-27T00:00:00.000Z",},
  {createdDt: "2021-02-27T00:00:00.000Z",},
  {createdDt: "2021-02-24T00:00:00.000Z",},
  {createdDt: "2021-02-23T00:00:00.000Z",},
];

console.log(solve(data));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

结果中的值可能很少undefined,但无需将其设置为,0因为它可以被视为0您要显示/使用它的任何位置。


推荐阅读