代码之家  ›  专栏  ›  技术社区  ›  Liz Parody

将pickby和mapValues从lodash转换为函数

  •  1
  • Liz Parody  · 技术社区  · 7 年前

    我正在尝试将使用pickBy和mapValues的函数从lodash转换为不使用lodash的函数。

    import mapValues from 'lodash/mapValues';
    import pickBy from 'lodash/pickBy';
    
        function clinicsWithInvitations(upcomingClinics) {
          const upClinics = upcomingClinics.clinics;
          const upInvitations = upcomingClinics.invitations;
    
          const getInvitations = id => pickBy(upInvitations, inv => inv.clinicId === id);
          const mergeInvitations = (clinic, clinicId) => ({
            ...clinic,
            invitations: getInvitations(clinicId),
          });
    
          return mapValues(upClinics, mergeInvitations);
        }
    

    我试过但没用

    function clinicsWithInvitations(upcomingClinics) {
      const upClinics = upcomingClinics.clinics;
      const upInvitations = upcomingClinics.invitations;
    
      const getInvitations = clinicId =>
        Object.keys(upInvitations).reduce((acc, invId) => {
          const inv = upInvitations[invId];
          return inv.clinicId === clinicId ? { ...acc, [inv.clinicId]: inv } : acc;
        }, {});
    
      const mergeInvitations = (acc, clinicId) => ({
        ...acc,
        [clinicId]: {
          ...upClinics[clinicId],
          invitations: getInvitations(clinicId),
        },
      });
      return Object.keys(upClinics).reduce(mergeInvitations, {});
    }
    

    我要做的是将两个对象合并为一个对象,我要将诊所与邀请关联起来,同时考虑到 clinicId ,所以我有这个:

    const upcomingClinics = {
      "clinics": {
        "a0CW000000271LuMAI": {
          "id": "a0CW000000271LuMAI",
          "contact": {
            "name": null,
            "phone": null,
            "email": null
          },
          "shifts": {
            "teamLeads": 1,
            "healthTechs": 1
          }
        },
        "a0CW00000026gikMAA": {
          "id": "a0CW00000026gikMAA",
          "contact": {
            "name": null,
            "phone": null,
            "email": null
          },
          "shifts": {
            "teamLeads": 1,
            "healthTechs": 4
          }
        }
      },
      "invitations": {
        "56392": {
          "id": "56392",
          "clinicId": "a0CW00000026gikMAA"
        },
        "56393": {
          "id": "56393",
          "clinicId": "a0CW00000026gikMAA"
        },
        "56402": {
          "id": "56402",
          "clinicId": "a0CW00000026gikMAA"
        },
        "56427": {
          "id": "56427",
          "clinicId": "a0CW000000271LuMAI"
        },
        "56428": {
          "id": "56428",
          "clinicId": "a0CW000000271LuMAI"
        }
      }
    }
    

    这是期望的输出,但不会引起任何突变。

    const upcomingClinics = {
      "clinics": {
        "a0CW000000271LuMAI": {
          "id": "a0CW000000271LuMAI",
          "contact": {
            "name": null,
            "phone": null,
            "email": null
          },
          "shifts": {
            "teamLeads": 1,
            "healthTechs": 1
          }
          "invitations": {
            "56427": {
              "id": "56427",
              "clinicId": "a0CW000000271LuMAI"
            },
            "56428": {
              "id": "56428",
              "clinicId": "a0CW000000271LuMAI"
            }
          }
        },
        "a0CW00000026gikMAA": {
          "id": "a0CW00000026gikMAA",
          "contact": {
            "name": null,
            "phone": null,
            "email": null
          },
          "shifts": {
            "teamLeads": 1,
            "healthTechs": 4
          }
          "invitations": {
            "56392": {
              "id": "56392",
              "clinicId": "a0CW00000026gikMAA"
            },
            "56393": {
              "id": "56393",
              "clinicId": "a0CW00000026gikMAA"
            },
            "56402": {
              "id": "56402",
              "clinicId": "a0CW00000026gikMAA"
            },
          }
        }
      },
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Jacob    7 年前

    你目前的尝试看起来很接近,但我认为你有一个小的打字错误这:

    const getInvitations = clinicId =>
      Object.keys(upInvitations).reduce((acc, invId) => {
        const inv = upInvitations[invId];
        return inv.clinicId === clinicId ? { ...acc, [inv.clinicId]: inv } : acc;
      }, {});
    

    …正在使用 [inv.clinicId] 作为关键 invId 如果你想 invitations 属性将由邀请ID键入:

    const getInvitations = clinicId =>
      Object.keys(upInvitations).reduce((acc, invId) => {
        const inv = upInvitations[invId];
        return inv.clinicId === clinicId ? { ...acc, [invId]: inv } : acc;
      }, {});
    
        2
  •  1
  •   charlietfl    7 年前

    下面首先使用clinicId作为键创建所有邀请的映射。

    然后是一个简单的循环,覆盖所有的诊所,合并他们

    function clinicsWithInvitations(upcomingClinics) {
    
      const invitesMap = Object.entries(upcomingClinics.invitations).reduce((a, [id, invite]) => {
        const clinic = a.get(invite.clinicId)  || {}
        clinic[id] = { ...invite};
        return a.set(invite.clinicId, clinic)
      }, new Map)
    
      const clinics = { ...upcomingClinics.clinics};
    
      Object.keys(clinics).forEach(k => clinics[k].inivitations = invitesMap.get(k) || {});
      
      return {clinics: clinics};
    }
    
    console.log(clinicsWithInvitations(upcomingClinics))
    .as-console-wrapper {
      max-height: 100%!important;
    }
    <script>
      const upcomingClinics = {
        "clinics": {
          "a0CW000000271LuMAI": {
            "id": "a0CW000000271LuMAI",
            "contact": {
              "name": null,
              "phone": null,
              "email": null
            },
            "shifts": {
              "teamLeads": 1,
              "healthTechs": 1
            }
          },
          "a0CW00000026gikMAA": {
            "id": "a0CW00000026gikMAA",
            "contact": {
              "name": null,
              "phone": null,
              "email": null
            },
            "shifts": {
              "teamLeads": 1,
              "healthTechs": 4
            }
          }
        },
        "invitations": {
          "56392": {
            "id": "56392",
            "clinicId": "a0CW00000026gikMAA"
          },
          "56393": {
            "id": "56393",
            "clinicId": "a0CW00000026gikMAA"
          },
          "56402": {
            "id": "56402",
            "clinicId": "a0CW00000026gikMAA"
          },
          "56427": {
            "id": "56427",
            "clinicId": "a0CW000000271LuMAI"
          },
          "56428": {
            "id": "56428",
            "clinicId": "a0CW000000271LuMAI"
          }
        }
      }
    </script>