【问题标题】:How to fill missing dates inside array of object using javascript?如何使用javascript填充对象数组中缺失的日期?
【发布时间】:2021-05-14 11:25:19
【问题描述】:

我想从今天到接下来的 7 天填充这个对象。这是我的对象

let obj = {
  "sessions": [{
       "id": 0,
       "available_capacity": 3,
       "date": "15-05-2021"
   },
   {
       "id": 1,
       "available_capacity": 5,
       "date": "16-05-2021"
   },
   {
       "id": 2,
       "available_capacity": 2,
       "date": "18-05-2021"
   }]
}

预期输出:

let output = {
  "sessions": [{
       "date": "14-05-2021"
   },
   {
       "id": 0,
       "available_capacity": 3,
       "date": "15-05-2021"
   },
   {
       "id": 1,
       "available_capacity": 5,
       "date": "16-05-2021"
   },
   {
       "date": "17-05-2021"
   },
   {
       "id": 2,
       "available_capacity": 2,
       "date": "18-05-2021"
   },
   {
       "date": "19-05-2021"
   },
   {
       "date": "20-05-2021"
   }]
}

这是生成从今天到接下来 7 天的日期数组的代码

function getWeekDates() {
    let dates = [];
    for (let i = 0; i <= 6; i++) {
      dates.push(new Date(Date.now() + 1000 * 3600 * (i * 24)).toLocaleDateString('en-GB').replace('/', '-').replace('/', '-'));
    }
    console.log(dates);
}

getWeekDates();

//result: ["14-05-2021", "15-05-2021", "16-05-2021", "17-05-2021", "18-05-2021", "19-05-2021", "20-05-2021"]

如何填写缺少的日期?

【问题讨论】:

  • 应通过添加 1 天而不是 24 小时来将日期增加一天,因为在观察到夏令时时,天并非都是 24 小时,请参阅Incrementing a date in JavaScript

标签: javascript arrays json date object


【解决方案1】:

您可以使用此代码生成日期数组。您可以传递您需要的 startDate 和 numberOfDays。在你的情况下,你可以dateRange(new Date(), 7)

const DAY_IN_MS = 24 * 60 * 60 * 1000
const dateRange = (startDate, numOfDays) => {
    const startDateInMs = startDate.getTime()
    return [...Array(numOfDays).keys()].map(i => new Date(startDateInMs + i * DAY_IN_MS).toISOString().slice(0,10))
}

let dates = dateRange(new Date(),7);
console.log(dates);

您可以使用Array.prototype.map 并使用Array.prototype.find 返回检查 obj.sessions 中是否存在日期,然后返回对象,否则只返回相同的日期。 Array.prototype.find 如果项目不存在则返回 undefined。

let obj = {
  "sessions": [{
       "id": 0,
       "available_capacity": 3,
       "date": "15-05-2021"
   },
   {
       "id": 1,
       "available_capacity": 5,
       "date": "16-05-2021"
   },
   {
       "id": 2,
       "available_capacity": 2,
       "date": "18-05-2021"
   }]
}
function getWeekDates() {
    let dates = [];
    for (let i = 0; i <= 6; i++) {
      dates.push(new Date(Date.now() + 1000 * 3600 * (i * 24)).toLocaleDateString('en-GB').replace('/', '-').replace('/', '-'));
    }
    return dates;
}

let dates = getWeekDates();
let r = dates.map(d => {
  let o = obj.sessions.find(x => x.date === d);
  return o ?? {date: d}
 });
console.log(r);

【讨论】:

  • 应通过添加 1 天而不是 24 小时来将日期增加一天,因为在观察夏令时的情况下,天并非都是 24 小时,请参阅Incrementing a date in JavaScript
【解决方案2】:

你正在寻找类似下面的东西。


function getWeekDates() {
    let dates = [];
    for (let i = 0; i <= 6; i++) {
      dates.push(new Date(Date.now() + 1000 * 3600 * (i * 24)).toLocaleDateString('en-GB').replace('/', '-').replace('/', '-'));
    }
    return dates
}
getWeekDates().map(date => {
    return obj.sessions.find(s => s.date === date) || date
})


/* 

Output

[
    {
        "date": "14-05-2021"
    },
    {
        "id": 0,
        "available_capacity": 3,
        "date": "15-05-2021"
    },
    {
        "id": 1,
        "available_capacity": 5,
        "date": "16-05-2021"
    },
    {
        "date": "17-05-2021"
    },
    {
        "id": 2,
        "available_capacity": 2,
        "date": "18-05-2021"
    },
    {
        "date": "19-05-2021"
    },
    {
        "date": "20-05-2021"
    }
]
*/

【讨论】:

  • already_present 变量不是必需的。您可以直接检查同一对象中的日期。请检查我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多