【问题标题】:How can we group multi-level grouping in Javascript?我们如何在 Javascript 中对多级分组进行分组?
【发布时间】:2022-11-04 14:52:20
【问题描述】:

我们可以在多级中对对象数组进行分组吗?这是我的一组对象,它们具有共同的日期和地点,但时间不同。

[
{
    "ID": 2104221,
    "date": "2022-11-18T00:00:00",
    "day": "18",
    "weekDay": "Fri",
    "month": "Nov",
    "Placeid": 2293,
    "Place": "AAAAAA",
    "address": "25 SSSSSS",
    "city": "RRRRR",
    "state": "WWWW",
    "Time": "8:00 PM"
},
{
    "ID": 2104344,
    "date": "2022-11-15T00:00:00",
    "day": "15",
    "weekDay": "Tue",
    "month": "Nov",
    "Placeid": 3478,
    "Place": "BIG",
    "address": "1433 The ADDDD,",
    "city": "CA",
    "state": "",
    "zipCode": "95126",
    "Time": "03:00 PM"
},
{
    "ID": 2104345,
    "date": "2022-11-15T00:00:00",
    "day": "15",
    "weekDay": "Tue",
    "month": "Nov",
    "Placeid": 3478,
    "Place": "BIG",
    "address": "1433 The ADDDD,",
    "city": "CA",
    "state": "",
    "zipCode": "95126",
    "Time": "06:00 PM"
},
{
    "ID": 2104346,
    "date": "2022-11-15T00:00:00",
    "day": "15",
    "weekDay": "Tue",
    "month": "Nov",
    "Placeid": 3478,
    "Place": "BIG",
    "address": "1433 The ADDDD,",
    "city": "CA",
    "state": "",
    "zipCode": "95126",
    "Time": "09:00 PM"
},
{
    "ID": 2104347,
    "date": "2022-11-15T00:00:00",
    "day": "15",
    "weekDay": "Tue",
    "month": "Nov",
    "Placeid": 2464,
    "Place": "ATheaters",
    "address": "2901 Capital",
    "city": "C",
    "state": "TT",
    "Time": "06:00 PM"
},
{
    "ID": 2104348,
    "date": "2022-11-15T00:00:00",
    "day": "15",
    "weekDay": "Tue",
    "month": "Nov",
    "Placeid": 2464,
    "Place": "ATheaters",
    "address": "2901 Capital",
    "city": "ANNNN",
    "state": "TT",
    "Time": "10:00 PM"
},
{
    "ID": 2103857,
    "date": "2022-11-05T16:30:00",
    "day": "5",
    "weekDay": "Sat",
    "month": "Nov",
    "Placeid": 34771,
    "Place": "Playhouse",
    "address": "525 Palace",
    "city": "BBBB",
    "state": "YYYYY",
    "Time": " 4:30 PM"
},
{
    "ID": 2103858,
    "date": "2022-11-05T23:30:00",
    "day": "5",
    "weekDay": "Sat",
    "month": "Nov",
    "Placeid": 34771,
    "Place": "Playhouse",
    "address": "525 Palace",
    "city": "BBBB",
    "state": "YYYYY",
    "Time": "11:30 PM"
},
{
    "ID": 2103862,
    "date": "2022-11-15T23:00:00",
    "day": "15",
    "weekDay": "Tue",
    "month": "Nov",
    "Placeid": 34771,
    "Place": "Playhouse",
    "address": "525 Palace",
    "city": "BBBB",
    "state": "YYYYY",
    "Time": "11:00 PM"
}

]

我想根据日期和地点进行分组。我想要的输出将是

[
{
    "day": "18",
    "date": "2022-11-18T00:00:00",
    "weekDay": "Fri",
    "month": "Nov",
    "Places": [
        {
            "Placeid": 2293,
            "Place": "AAAAAA",
            "address": "25 SSSSSS",
            "city": "RRRRR",
            "state": "WWWW",
            "Timings": [
                {
                    "ID": 2104221,
                    "Time": "8:00 PM"
                }
            ]
        }
    ]
},
{
    "day": "15",
    "date": "2022-11-15T23:00:00",
    "weekDay": "Tue",
    "month": "Nov",
    "Places": [
        {
            "Placeid": 3478,
            "Place": "BIG",
            "address": "1433 The ADDDD,",
            "city": "CA",
            "state": "",
            "Timings": [
                {
                    "ID": 2104344,
                    "Time": "03:00 PM"
                },
                {
                    "ID": 2104345,
                    "Time": "06:00 PM"
                },
                {
                    "ID": 2104346,
                    "Time": "09:00 PM"
                }
            ]
        },
        {
            "Placeid": 2464,
            "Place": "ATheaters",
            "address": "2901 Capital",
            "city": "ANNNN",
            "state": "TT",
            "Timings": [
                {
                    "ID": 2104347,
                    "Time": "06:00 PM"
                },
                {
                    "ID": 2104348,
                    "Time": "10:00 PM"
                }
            ]
        },
        {
            "Placeid": 34771,
            "Place": "Playhouse",
            "address": "525 Palace",
            "city": "BBBB",
            "Timings": [
                {
                    "ID": 2103862,
                    "Time": "11:00 PM"
                }
            ]
        }
    ]
},

{
    "day": "5",
    "date": "2022-11-05T16:30:00",
    "weekDay": "Sat",
    "month": "Nov",
    "Places": [
        {
            "Placeid": 34771,
            "Place": "Playhouse",
            "address": "525 Palace",
            "city": "BBBB",
            "state": "YYYYY",
            "Timings": [
                {
                    "ID": 2103857,
                    "Time": " 4:30 PM"
                },
                {
                    "ID": 2103858,
                    "Time": "11:30 PM"
                }
            ]
        }
    ]
}
]

是否可以使用javascript进行这样的分组?我尝试使用以下代码进行分组。但我没有得到我想要的输出。

    const MultiLevelGrouping=(data,['day','Placeid'])=>{
    var getEmpty = () => ({ _: [] }),
    result = data
      .reduce((q, o) => {
          groups
              .reduce((r, k) => {
                  const v = o[k];
                  if (!v) return r;
                  if (!r[v]) r._.push({ [k]: v, [k + 'Detail']: (r[v] = getEmpty())._ });
                  return r[v];
              }, q)
              ._
              .push(o);
          return q;
      }, getEmpty())
      ._;
return result;
}

有人可以帮我吗 ?

【问题讨论】:

    标签: javascript arrays grouping javascript-objects


    【解决方案1】:

    您可以使用 2 个映射器对象。一个每天分组,另一个分组每个日间组合。然后在它的每个映射器对象中创建条目还不存在。

    const input = [{ID:2104221,date:"2022-11-18T00:00:00",day:"18",weekDay:"Fri",month:"Nov",Placeid:2293,Place:"AAAAAA",address:"25 SSSSSS",city:"RRRRR",state:"WWWW",Time:"8:00 PM"},{ID:2104344,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:3478,Place:"BIG",address:"1433 The ADDDD,",city:"CA",state:"",zipCode:"95126",Time:"03:00 PM"},{ID:2104345,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:3478,Place:"BIG",address:"1433 The ADDDD,",city:"CA",state:"",zipCode:"95126",Time:"06:00 PM"},{ID:2104346,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:3478,Place:"BIG",address:"1433 The ADDDD,",city:"CA",state:"",zipCode:"95126",Time:"09:00 PM"},{ID:2104347,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:2464,Place:"ATheaters",address:"2901 Capital",city:"C",state:"TT",Time:"06:00 PM"},{ID:2104348,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:2464,Place:"ATheaters",address:"2901 Capital",city:"ANNNN",state:"TT",Time:"10:00 PM"},{ID:2103857,date:"2022-11-05T16:30:00",day:"5",weekDay:"Sat",month:"Nov",Placeid:34771,Place:"Playhouse",address:"525 Palace",city:"BBBB",state:"YYYYY",Time:" 4:30 PM"},{ID:2103858,date:"2022-11-05T23:30:00",day:"5",weekDay:"Sat",month:"Nov",Placeid:34771,Place:"Playhouse",address:"525 Palace",city:"BBBB",state:"YYYYY",Time:"11:30 PM"},{ID:2103862,date:"2022-11-15T23:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:34771,Place:"Playhouse",address:"525 Palace",city:"BBBB",state:"YYYYY",Time:"11:00 PM"}],
          dayMap = {},
          dayPlaceMap = {};
    
    for(const { day, date, weekDay, month, Placeid, ID, Time, ...rest } of input) {
      dayMap[day] ??= { day, date, weekDay, month, Places: [] };
      const comboKey = `${day}|${Placeid}`
      
      if(!dayPlaceMap[comboKey]) {
        dayPlaceMap[comboKey] ??= { Placeid, ...rest, Timings: [] }
        dayMap[day].Places.push( dayPlaceMap[comboKey] )
      }
      
      dayPlaceMap[comboKey].Timings.push({ ID, Time })
    }
    
    console.log(Object.values(dayMap))

    【讨论】:

      【解决方案2】:

      你可以这样做,首先我们创建一个键为day 的映射,值将是另一个以placeid 为键和项数组作为值的映射。然后我们迭代这个多图并生成想要的结果

      const data=[{ID:2104221,date:"2022-11-18T00:00:00",day:"18",weekDay:"Fri",month:"Nov",Placeid:2293,Place:"AAAAAA",address:"25 SSSSSS",city:"RRRRR",state:"WWWW",Time:"8:00 PM"},{ID:2104344,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:3478,Place:"BIG",address:"1433 The ADDDD,",city:"CA",state:"",zipCode:"95126",Time:"03:00 PM"},{ID:2104345,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:3478,Place:"BIG",address:"1433 The ADDDD,",city:"CA",state:"",zipCode:"95126",Time:"06:00 PM"},{ID:2104346,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:3478,Place:"BIG",address:"1433 The ADDDD,",city:"CA",state:"",zipCode:"95126",Time:"09:00 PM"},{ID:2104347,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:2464,Place:"ATheaters",address:"2901 Capital",city:"C",state:"TT",Time:"06:00 PM"},{ID:2104348,date:"2022-11-15T00:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:2464,Place:"ATheaters",address:"2901 Capital",city:"ANNNN",state:"TT",Time:"10:00 PM"},{ID:2103857,date:"2022-11-05T16:30:00",day:"5",weekDay:"Sat",month:"Nov",Placeid:34771,Place:"Playhouse",address:"525 Palace",city:"BBBB",state:"YYYYY",Time:" 4:30 PM"},{ID:2103858,date:"2022-11-05T23:30:00",day:"5",weekDay:"Sat",month:"Nov",Placeid:34771,Place:"Playhouse",address:"525 Palace",city:"BBBB",state:"YYYYY",Time:"11:30 PM"},{ID:2103862,date:"2022-11-15T23:00:00",day:"15",weekDay:"Tue",month:"Nov",Placeid:34771,Place:"Playhouse",address:"525 Palace",city:"BBBB",state:"YYYYY",Time:"11:00 PM"},];
      
      
      const groupByDayAndPlace = (items) => {
        const map = {};
      
        items.forEach((item) => {
          if (!map[item.day]) {
            map[item.day] = {};
          }
      
          if (!map[item.day][item.Placeid]) {
            map[item.day][item.Placeid] = [item];
          } else {
            map[item.day][item.Placeid].push(item);
          }
        });
      
        return Object.entries(map).map(([day, placesMap]) => {
          const { date, month, weekDay } = Object.values(placesMap)[0][0];
          return {
            day,
            date,
            month,
            weekDay,
            Places: Object.entries(placesMap).map(([Placeid, items]) => ({
              Placeid,
              Place: items[0].Place,
              address: items[0].address,
              city: items[0].city,
              state: items[0].state,
              Timings: items.map(({ ID, Time }) => ({ ID, Time })),
            })),
          };
        });
      };
      
      console.log(groupByDayAndPlace(data));

      【讨论】:

        猜你喜欢
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多