首页 > 解决方案 > 如何在javascript中按日期范围从对象数组中获取唯一数据

问题描述

大家好,我需要帮助我正在尝试通过 JavaScript 中的 from_date 和 to_date 从对象数组中获取最新数据我无法获取它下面是我的数组

[
    {"id": 408,"customer_id": 2,"bill_no": 381,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 409,"customer_id": 3,"bill_no": 382,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 410,"customer_id": 4,"bill_no": 383,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 411,"customer_id": 6,"bill_no": 384,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 412,"customer_id": 7,"bill_no": 385,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 413,"customer_id": 8,"bill_no": 386,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 414,"customer_id": 9,"bill_no": 387,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 387,"customer_id": 2,"bill_no": 360,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 388,"customer_id": 3,"bill_no": 361,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 389,"customer_id": 4,"bill_no": 362,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 390,"customer_id": 6,"bill_no": 363,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 391,"customer_id": 7,"bill_no": 364,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 392,"customer_id": 8,"bill_no": 365,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 393,"customer_id": 9,"bill_no": 366,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 380,"customer_id": 2,"bill_no": 353,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 381,"customer_id": 3,"bill_no": 354,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 382,"customer_id": 4,"bill_no": 355,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 383,"customer_id": 6,"bill_no": 356,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 384,"customer_id": 7,"bill_no": 357,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 385,"customer_id": 8,"bill_no": 358,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 386,"customer_id": 9,"bill_no": 359,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"}
]

我正在使用此代码进行排序/过滤:

const filtered = res.data.reduce((accumulator, current) => { 
    if (accumulator.find(x => x.customer_id === current.customer_id) { 
        return accumulator; } 
    accumulator.push(current); return accumulator; }, []); 
console.log(filtered);

我想要上面数组中的唯一数据,从开始到最新日期,我想要如下代码的结果

[
{"id": 408,"customer_id": 2,"bill_no": 381,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 409,"customer_id": 3,"bill_no": 382,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 410,"customer_id": 4,"bill_no": 383,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 411,"customer_id": 6,"bill_no": 384,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 412,"customer_id": 7,"bill_no": 385,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 413,"customer_id": 8,"bill_no": 386,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 414,"customer_id": 9,"bill_no": 387,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
]

标签: javascript

解决方案


您可以使用Array.filter()仅获取您想要的对象。您可以使用 Date 构造函数将您的from_date和转换to_date为 Date 对象,您可以简单地将其与所需的日期范围进行比较。

const bills = [
    {"id": 408,"customer_id": 2,"bill_no": 381,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 409,"customer_id": 3,"bill_no": 382,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 410,"customer_id": 4,"bill_no": 383,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 411,"customer_id": 6,"bill_no": 384,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 412,"customer_id": 7,"bill_no": 385,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 413,"customer_id": 8,"bill_no": 386,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 414,"customer_id": 9,"bill_no": 387,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 387,"customer_id": 2,"bill_no": 360,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 388,"customer_id": 3,"bill_no": 361,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 389,"customer_id": 4,"bill_no": 362,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 390,"customer_id": 6,"bill_no": 363,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 391,"customer_id": 7,"bill_no": 364,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 392,"customer_id": 8,"bill_no": 365,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 393,"customer_id": 9,"bill_no": 366,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 380,"customer_id": 2,"bill_no": 353,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 381,"customer_id": 3,"bill_no": 354,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 382,"customer_id": 4,"bill_no": 355,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 383,"customer_id": 6,"bill_no": 356,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 384,"customer_id": 7,"bill_no": 357,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 385,"customer_id": 8,"bill_no": 358,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 386,"customer_id": 9,"bill_no": 359,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"}
];

// Your desired date range
const startDate = new Date(2021, 10 - 1, 10);
const endDate = new Date(2021, 10 - 1, 16);

const filteredBills = bills.filter(bill => {
  // Convert to Date object
  const [fromYear, fromMonth, fromDay] = bill.from_date.split("-");
  const [toYear, toMonth, toDay] = bill.to_date.split("-");

  const fromDate = new Date(fromYear, fromMonth - 1, fromDay);
  const toDate = new Date(toYear, toMonth - 1, toDay);

  // Check if dates are within your desired range
  const fromDateWithinRange = fromDate >= startDate && fromDate <= endDate;
  const toDateWithinRange = toDate >= startDate && toDate <= endDate;

  return fromDateWithinRange && toDateWithinRange;
});


console.log(JSON.stringify(filteredBills));

日期文档:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date

Array.filter()文档:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter


推荐阅读