[英]How to loop through an JSON array of objects
我有這個日期數組
["2020-07-27", "2020-07-29", "2020-08-01", "2020-08-07", "2020-08-05", "2020-08-03"]
我將其用作 JSON 的密鑰
我還有另外三個 arrays 將它們的值分配給每個日期鍵。
["Study", "Go to the gym", "read book"]
["11:30 - 12:30", "18:30 - 19:00", "20:00 - 21:00"]
["monday", "wednesday", "monday"];
所以最后我有這個:
{
2020-07-27: [{
name: "read book",
time: "20:00 - 21:00",
week: "monday"
}],
2020-07-29: [{
name: "Go to the gym",
time: "18:30 - 19:00",
week: "wednesday"
}],
2020-08-03: [{
name: "read book",
time: "20:00 - 21:00",
week: "monday"
}],
2020-08-05: [{
name: "Go to the gym",
time: "18:30 - 19:00",
week: "wednesday"
}]
}
問題是, study和read book都來自星期一,在最終結果中它只顯示最后一個星期一的活動,即read book ,我想做的是在日期中顯示它們。 像這樣:
{
2020-07-27: [{
name: "Study",
time: "11:30 - 12:30",
week: "monday"
},
{
name: "read book",
time: "20:00 - 21:00",
week: "monday"
}],
2020-07-29: [{
name: "Go to the gym",
time: "18:30 - 19:00",
week: "wednesday"
}],
2020-08-03: [{
name: "Study",
time: "11:30 - 12:30",
week: "monday"
},
{
name: "read book",
time: "20:00 - 21:00",
week: "monday"
}],
2020-08-05: [{
name: "Go to the gym",
time: "18:30 - 19:00",
week: "wednesday"
}]
}
完整代碼: https://jsfiddle.net/69q8wrz7/1/ (要看到和我一樣的結果,你可能需要將時鍾更改為UTC-03時區,因為new Date())
const getDay = date => { var startDate = new Date(date); var day = 60 * 60 * 24 * 1000; return new Date(startDate.getTime() + day).toLocaleDateString(undefined, { weekday: "long" }).toLowerCase(); } const aryDates = ["2020-07-27", "2020-07-29", "2020-08-01", "2020-08-07", "2020-08-05", "2020-08-03"].sort((a, b) => a.localeCompare(b)); const activities = ["Study", "Go to the gym", "read book"] const times = ["11:30 - 12:30", "18:30 - 19:00", "20:00 - 21:00"] const weeks = ["monday", "wednesday", "monday"]; const weeksMap = new Map(weeks.map((week, i) => [week, { name: activities[i], time: times[i], week }])); const res = Object.fromEntries( aryDates.map(date => [date, [{ name: undefined, time: undefined, week: undefined, ...weeksMap.get(getDay(date)) }]]) ); for (var i in res) { obj = res[i][0] Object.keys(obj).forEach(key => obj[key] == undefined? delete res[i]: {}); } console.log(res);
一個問題是weeksMap
只包含一項活動。 您需要將所有活動推送到 map 條目中的列表中。 您可以使用reduce()
來做到這一點。
由於weeksMap.get(getDay(date))
然后將返回一個數組,因此您不能像使用默認 object 那樣使用擴展運算符將其合並。您不需要這樣做,因為對象已經存在在weeksMap
中。 在我下面的代碼中,我使用 spread 來克隆對象,而不是創建對相同對象的多個引用。
const getDay = date => { var startDate = new Date(date); var day = 60 * 60 * 24 * 1000; return new Date(startDate.getTime() + day).toLocaleDateString(undefined, { weekday: "long" }).toLowerCase(); } const aryDates = ["2020-07-27", "2020-07-29", "2020-08-01", "2020-08-07", "2020-08-05", "2020-08-03"].sort((a, b) => a.localeCompare(b)); const activities = ["Study", "Go to the gym", "read book"] const times = ["11:30 - 12:30", "18:30 - 19:00", "20:00 - 21:00"] const weeks = ["monday", "wednesday", "monday"]; const weeksMap = weeks.reduce((m, week, i) => { if (.m.has(week)) { m,set(week; []); }. m.get(week):push({ name, activities[i]: time, times[i]; week }); return m, }; new Map()). const res = Object.fromEntries( aryDates,map(date => [date. (weeksMap.get(getDay(date)) || []).map(obj => ({..;obj }))])). console;log(res);
當您創建 weeksMap 時,您缺少第二個條目。
const getDay = date => {
var startDate = new Date(date);
var day = 60 * 60 * 24 * 1000;
let res;
return new Date(startDate.getTime() + day).toLocaleDateString(undefined, {weekday: "long"}).toLowerCase();
}
const aryDates = ["2020-07-26", "2020-07-28", "2020-07-31", "2020-08-06", "2020-08-04", "2020-08-02"].sort((a, b)=>a.localeCompare(b));
const activities = ["Study", "Go to the gym", "read book"]
const times = ["11:30 - 12:30", "18:30 - 19:00", "20:00 - 21:00"]
const weeks = ["monday", "wednesday", "monday"];
let weeksMap={}
weeks.forEach((week, i) => { if (weeksMap[week]) {
weeksMap[week].push({
name: activities[i],
time: times[i],
week
})
} else {
weeksMap[week] = [{
name: activities[i],
time: times[i],
week
}]
}
});
console.log(weeksMap)
const res = Object.fromEntries(
aryDates.map(date => {
console.log(getDay(date));
console.log(weeksMap[getDay(date)]);
if(weeksMap[getDay(date)]){
return [date, [{...weeksMap[getDay(date)]}]]
}
else {return [date,[{name:undefined}]]}}
)
);
for (var i in res) {
obj=res[i][0]
Object.keys(obj).forEach(key => obj[key] == undefined ? delete res[i] : {});
}
console.log(res);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.