【问题标题】:How can I group by id in a array?如何在数组中按 id 分组?
【发布时间】:2020-11-11 10:18:03
【问题描述】:

我的数据数组是这样的:

let dataHospital = {
    availability: [
        {
            hosp_id: "1",
            hosp_name: "Hospital A",
            is_available: true
        },
        {
            hosp_id: "2",
            hosp_name: "Hospital B",
            is_available: false
        },
        {
            hosp_id: "3",
            hosp_name: "Hospital C",
            is_available: true
        }
    ],
    schedule: [
        {
            schedule_id: "xx1",
            hospital_id: "1",
            day: 1,
            from_time: "09:00:00",
            to_time: "13:00:00",
            hospital_name: "Hospital A",
        },
        {
            schedule_id: "xx2",
            hospital_id: "1",
            day: 2,
            from_time: "13:00:00",
            to_time: "20:00:00",
            hospital_name: "Hospital A"
        },
        {
            schedule_id: "xx3",
            hospital_id: "1",
            day: 3,
            from_time: "12:00:00",
            to_time: "23:00:00",
            hospital_name: "Hospital A"
        },
        {
            schedule_id: "xx4",
            hospital_id: "1",
            day: 4,
            from_time: "13:00:00",
            to_time: "16:00:00",
            hospital_name: "Hospital A"
        },
        {
            schedule_id: "xx5",
            hospital_id: "1",
            day: 5,
            from_time: "09:00:00",
            to_time: "13:00:00",
            hospital_name: "Hospital A"
        },
        {
            schedule_id: "xx6",
            hospital_id: "1",
            day: 6,
            from_time: "09:00:00",
            to_time: "18:00:00",
            hospital_name: "Hospital A"
        },
        {
            schedule_id: "xx7",
            hospital_id: "2",
            day: 1,
            from_time: "10:00:00",
            to_time: "14:00:00",
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx8",
            hospital_id: "2",
            day: 2,
            from_time: "10:00:00",
            to_time: "14:00:00",
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx9",
            hospital_id: "2",
            day: 2,
            from_time: "16:00:00",
            to_time: "18:00:00",             
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx10",
            hospital_id: "2",
            day: 3,
            from_time: "10:00:00",
            to_time: "14:00:00",
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx11",
            hospital_id: "2",
            day: 3,
            from_time: "16:00:00",
            to_time: "18:00:00",
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx12",
            hospital_id: "2",
            day: 4,
            from_time: "08:00:00",
            to_time: "10:00:00",
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx13",
            hospital_id: "2",
            day: 5,
            from_time: "10:00:00",
            to_time: "14:00:00",
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx14",
            hospital_id: "2",
            day: 6,
            from_time: "10:00:00",
            to_time: "14:00:00",
            hospital_name: "Hospital B"
        },
        {
            schedule_id: "xx15",
            hospital_id: "3",
            day: 1,
            from_time: "15:00:00",
            to_time: "17:00:00",
            hospital_name: "Hospital C"
        },
        {
            schedule_id: "xx16",
            hospital_id: "3",
            day: 4,
            from_time: "15:00:00",
            to_time: "17:00:00",
            hospital_name: "Hospital C"
        },
        {
            schedule_id: "xx17",
            hospital_id: "3",
            day: 5,
            from_time: "15:00:00",
            to_time: "17:00:00",
            hospital_name: "Hospital C",
        }
    ]
}

所以我有这样的数据数组。我想像这样更改数组:

let dataNewHospital = [
    {
        hosp_id: "1",
        hosp_name: "Hospital A",
        is_available: true,
        schedule: [
            {
                schedule_id: "xx1",
                hospital_id: "1",
                day: 1,
                from_time: "09:00:00",
                to_time: "13:00:00",
                hospital_name: "Hospital A",
            },
            {
                schedule_id: "xx2",
                hospital_id: "1",
                day: 2,
                from_time: "13:00:00",
                to_time: "20:00:00",
                hospital_name: "Hospital A"
            },
            {
                schedule_id: "xx3",
                hospital_id: "1",
                day: 3,
                from_time: "12:00:00",
                to_time: "23:00:00",
                hospital_name: "Hospital A"
            },
            {
                schedule_id: "xx4",
                hospital_id: "1",
                day: 4,
                from_time: "13:00:00",
                to_time: "16:00:00",
                hospital_name: "Hospital A"
            },
            {
                schedule_id: "xx5",
                hospital_id: "1",
                day: 5,
                from_time: "09:00:00",
                to_time: "13:00:00",
                hospital_name: "Hospital A"
            },
            {
                schedule_id: "xx6",
                hospital_id: "1",
                day: 6,
                from_time: "09:00:00",
                to_time: "18:00:00",
                hospital_name: "Hospital A"
            }
        ]
    },
    {
        hosp_id: "2",
        hosp_name: "Hospital B",
        is_available: false,
        schedule: [
            {
                schedule_id: "xx7",
                hospital_id: "2",
                day: 1,
                from_time: "10:00:00",
                to_time: "14:00:00",
                hospital_name: "Hospital B"
            },
            {
                schedule_id: "xx8",
                hospital_id: "2",
                day: 2,
                from_time: "10:00:00",
                to_time: "14:00:00",
                hospital_name: "Hospital B"
            },
            {
                schedule_id: "xx9",
                hospital_id: "2",
                day: 2,
                from_time: "16:00:00",
                to_time: "18:00:00",             
                hospital_name: "Hospital B"
            },
            {
                schedule_id: "xx10",
                hospital_id: "2",
                day: 3,
                from_time: "10:00:00",
                to_time: "14:00:00",
                hospital_name: "Hospital B"
            },
            {
                schedule_id: "xx11",
                hospital_id: "2",
                day: 3,
                from_time: "16:00:00",
                to_time: "18:00:00",
                hospital_name: "Hospital B"
            },
            {
                schedule_id: "xx12",
                hospital_id: "2",
                day: 4,
                from_time: "08:00:00",
                to_time: "10:00:00",
                hospital_name: "Hospital B"
            },
            {
                schedule_id: "xx13",
                hospital_id: "2",
                day: 5,
                from_time: "10:00:00",
                to_time: "14:00:00",
                hospital_name: "Hospital B"
            },
            {
                schedule_id: "xx14",
                hospital_id: "2",
                day: 6,
                from_time: "10:00:00",
                to_time: "14:00:00",
                hospital_name: "Hospital B"
            }
        ]
    },
    {
        hosp_id: "3",
        hosp_name: "Hospital C",
        is_available: true,
        schedule: [
            {
                schedule_id: "xx15",
                hospital_id: "3",
                day: 1,
                from_time: "15:00:00",
                to_time: "17:00:00",
                hospital_name: "Hospital C"
            },
            {
                schedule_id: "xx16",
                hospital_id: "3",
                day: 4,
                from_time: "15:00:00",
                to_time: "17:00:00",
                hospital_name: "Hospital C"
            },
            {
                schedule_id: "xx17",
                hospital_id: "3",
                day: 5,
                from_time: "15:00:00",
                to_time: "17:00:00",
                hospital_name: "Hospital C",
            }
        ]
    }
]

我该怎么做?

【问题讨论】:

  • 如果您注意到反对意见,他们可能是因为人们想看看您到目前为止所做的尝试

标签: javascript jquery arrays key key-value


【解决方案1】:

这是我的解决方案:

dataHospital.availability.map(el => ({ 
     ...el , 
     schedule : dataHospital.schedule.filter( sc => sc.hospital_id == el.hosp_id) };
))

您在医院上进行映射,并向同一个对象({...el} 复制该对象)注入一个新属性 schedule,其相关时间表与当前的 hospital_id 相同

【讨论】:

    【解决方案2】:

    只是map 在医院和每家医院,filter 就像这样:

    let dataNewHospital = dataHospital.availability.map(hospital => ({
      ...hospital,
      schedule: dataHospital.schedule.filter(schedule => schedule.hospital_id === hospital.hosp_id)
    }));
    

    上述解决方案简洁但效率不高,因为它运行在每个医院的schedule 数组(这是更大的数组)上,理想情况下它应该运行一次。如果您有大量数据并且想要更快的方法,请尝试以下方法:

    let scheduleByHospital = dataHospital.schedule.reduce((acc, schedule) => {
      acc[schedule.hospital_id] = acc[schedule.hospital_id] || [];
      acc[schedule.hospital_id].push(schedule);
      return acc;
    }, Object.create(null));
    
    let dataNewHospital = dataHospital.availability.map(hospital => ({
      ...hospital,
      schedule: scheduleByHospital[hospital.hosp_id] || []
    }));
    

    【讨论】:

      【解决方案3】:

      这听起来像是Array.prototype.reduce 的工作:

      dataHospital.availability.reduce((result, availability) => {
        return [
          ...result,
          {
            ...availability,
            schedule: dataHospital.schedule.filter((schedule) => {
              return schedule.hospital_id === availability.hosp_id;
            })
          }
        ]
      }, []);
      

      【讨论】:

      • 作为一个附带问题,您使用的是reduce 而不是map?只是好奇
      • 我最初认为它应该以对象/哈希(“按 id 分组”)结束,而不是生成数组。如果结果应该是数组,map 可能更适合这里,真的。
      • 啊哈我只想知道背后的原因,不说哪个最好,顺便说一句,谢谢
      • 你可以使用the concise body of arrow functions,因为你的只有一个语句
      • 谢谢,我知道了。我总是喜欢在箭头函数中看到 return 语句,这些语句被拆分为多行,因为我在较长的箭头函数中忘记了它,因为它需要太多次。
      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 2021-10-14
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多