如何在Javascript中只从对象数组中获取本周数据?[duplicate]

ecfdbz9o  于 2023-02-11  发布在  Java
关注(0)|答案(3)|浏览(176)
    • 此问题在此处已有答案**:

How to get Current week from given array of objects date in javascript(5个答案)
12小时前关门了。
我正在开发一个算法,它应该从一个对象数组中返回本周的数据(包括整个月份的数据),数据看起来像这样:

[
 {
  date: 02/01/2023, // date is in ms
  soldItems:10
 },
 {
  date: 02/02/2023,
  soldItems:7
 },
 {
  date: 02/03/2023,
  soldItems:40
 },
{},...
]

我需要获取本周可用日期(周一至周三,2/6/2023 - 2/8/2023)的数据,如下所示:

{
  date: 02/06/2023,
  soldItems:45
 },
 {
  date: 02/07/2023,
  soldItems:30
 },
 {
  date: 02/08/2023,
  soldItems:5
 },

我知道我可以像这样度过这周的几天:

Array.from(Array(7).keys()).map((idx) => {const d = new Date(); d.setDate(d.getDate() - d.getDay() + idx); return d }

///returns

[
  2023-02-05T01:36:03.197Z,
  2023-02-06T01:36:03.197Z,
  2023-02-07T01:36:03.197Z,
  2023-02-08T01:36:03.197Z,
  2023-02-09T01:36:03.197Z,
  2023-02-10T01:36:03.197Z,
  2023-02-11T01:36:03.197Z
]

但是我不知道如何从对象数组中提取当前周的可用日期,例如我们没有02/09/2023(明天的日期)的数据,所以我只需要数组中的本周从星期一开始到可用日期(需要是动态的)。

sshcrbum

sshcrbum1#

我认为您需要将本周的格式修改为“mm/dd/yyyy”,并对数据使用filter(),如下所示:

data.filter(d => thisWeek.includes(d.date))
zvokhttg

zvokhttg2#

由于您的日期是以时间值(自ECMAScript纪元以来的毫秒数)表示的,因此您只需要获取日期范围开始和结束时的时间值,然后对这些值进行过滤。
看起来你的一周从星期一开始,所以要获得给定日期的一周中的任何特定工作日:
1.获取日期的工作日编号
1.如果是0(星期日),就改成7
1.从日期中减去工作日编号
1.添加所需日期的日期编号(其中Mon为1,Sun为7)
代码为:

// Return required day of week
// Week starts on Monday
// Day numbers: Mon = 1, Sat = 6, Sun = 0 or 7
// Returns: Date in week of date set to 0hrs on required day
function getWeekday(dayNum, date = new Date()) {
  // Copy input date so it's not modified
  let d = new Date(date.getFullYear(), date.getMonth(), date.getDate());
  // Set d to prior Sunday, then to required day
  d.setDate(d.getDate() - (d.getDay() || 7) + (Number(dayNum) || 7));
  return d;
}

// Return dates for start of starDay and end of endDay
function getDateRangeByWeekday(startDay, endDay, date = new Date()) {
  let s = getWeekday(startDay, date);
  let e = getWeekday(endDay, date);
  e.setHours(23,59,59,999);
  return [s, e];
}

// Get start of Mon and end of Wed in current week
let monWed = getDateRangeByWeekday(1, 3);
console.log(monWed.map(d=>d.toString()))

你可以只比较时间值和日期,它们将被强制为数字,或者你可以通过比较date.getTime()显式地完成。

rqqzpn5f

rqqzpn5f3#

我推荐使用date-fns,它非常小,而且树可以摇动,它使这一点变得简单明了:

import { eachDayOfInterval, format, startOfWeek } from "date-fns";

const data = [
  {
    date: "02 / 01 / 2023",
    soldItems: 10,
  },
  {
    date: "02 / 07 / 2023",
    soldItems: 7,
  },
  {
    date: "02 / 08 / 2023",
    soldItems: 40,
  },
];

const filterDataToWeek = (data, formatting = "MM / dd / yyyy", currDay) => {
  const end = currDay ?? new Date();
  const start = startOfWeek(end, { weekStartsOn: 1 });
  const daysInWeekSoFarArr = eachDayOfInterval({ start, end }).map((day) =>
    format(day, formatting)
  );

  return data.filter((i) => daysInWeekSoFarArr.includes(i.date));
};

console.log(filterDataToWeek(data));
// (2) [Object, Object]

相关问题