在映射JavaScript对象中包含的对象时,如何将值附加到该对象中的数组



我有一个JavaScript对象,其结构如下:

results = [
{
date: ... // holds a string representing a date
timeslots: [
{
slotsAvailable: ... // holds an int
time: ... // holds a string representing time
},
{
slotsAvailable: ...
time: ... 
}
] 
},
{
date: ... 
timeslots: [
{
slotsAvailable: ... 
time: ... 
},
{
slotsAvailable: ...
time: ... 
}
] 
},
{
date: ... 
timeslots: [
{
slotsAvailable: ... 
time: ... 
},
{
slotsAvailable: ...
time: ... 
}
] 
}
]

对象一开始是空的,我通过以下代码填充它:

"timeslots": [
{
"slotsAvailable": 1,
"time": "2022-02-11T14:00:00-0500"
},
{
"slotsAvailable": 1,
"time": "2022-02-13T13:40:00-0500"
},
{
"slotsAvailable": 1,
"time": "2022-02-15T17:40:00-0500"
},
{
"slotsAvailable": 1,
"time": "2022-02-15T18:20:00-0500"
},
{
"slotsAvailable": 1,
"time": "2022-02-16T14:00:00-0500"
},
{
"slotsAvailable": 1,
"time": "2022-02-16T14:20:00-0500"
},
{
"slotsAvailable": 1,
"time": "2022-02-17T21:40:00-0500"
}
]
var results = []

let date = new Date(timeslots[0].time)
for(let i = 0; i < 8; i++) {
results = [...results, {date: new Date(date), timeslots: []}] // Date function called b/c otherwise value is passed by reference
date.setDate(date.getDate() + 1)
} 
console.log(results)
for(const i in timeslots) {
let slot = timeslots[i]
results.map(result => {
return result.date.getDate() === new Date(slot.time).getDate() 
? {...result, timeslots: [...result.timeslots, slot]} // this line doesn't work
: result
})
}
console.log(results)

results对象在第一个循环中正确地填充了8个日期,但在第二个循环之后,所有timeslots数组仍然为空。预期的结果是,最终对象包含一个日期数组,其中每个时隙都放置在与其日期相对应的对象中。

我相信错误发生在第二个循环中的一行,我在现有数组中展开并向数组附加一个新值,但我不确定如何修复此问题。

建议?

这就是您期望的输出吗?

const timeslots= [{"slotsAvailable": 1,"time": "2022-02-11T14:00:00-0500"},{"slotsAvailable": 1,"time": "2022-02-13T13:40:00-0500"},{"slotsAvailable": 1,"time": "2022-02-15T17:40:00-0500"},{"slotsAvailable": 1,"time": "2022-02-15T18:20:00-0500"},{"slotsAvailable": 1,"time": "2022-02-16T14:00:00-0500"},{"slotsAvailable": 1,"time": "2022-02-16T14:20:00-0500"},{"slotsAvailable": 1,"time": "2022-02-17T21:40:00-0500"}]
const results = timeslots.reduce((acc, curr) => {
const date = curr.time.split('T')[0];
const time = curr.time.split('T')[1];
const dateTime = date + ' ' + time;
const dateTimeObject = new Date(dateTime);
const dateString = dateTimeObject.toDateString();
const timeString = dateTimeObject.toLocaleTimeString();
const timeObject = {
slotsAvailable: curr.slotsAvailable,
time: timeString,
};
if (acc.length === 0) {
acc.push({
date: dateString,
timeslots: [timeObject],
});
} else {
const lastIndex = acc.length - 1;
const lastDate = acc[lastIndex].date;
if (lastDate === dateString) {
acc[lastIndex].timeslots.push(timeObject);
} else {
acc.push({
date: dateString,
timeslots: [timeObject],
});
}
}
return acc;
}, []);
console.log(JSON.stringify(results, null, 2));
.as-console-wrapper{max-height:100%  !important; top:0px}

最新更新