簡體   English   中英

如何遍歷 JSON 對象數組

[英]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"
}]
}

問題是, studyread 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM