在对象JavaScript中关联两个键

时间:2018-07-17 22:27:07

标签: javascript object

因此,我有一个具有两个键clinicsinvitations的对象。我想将clinicsinvitations关联到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"
    }
  }
}

clinics对象的键始终与IDs匹配。基本上,我希望该对象看起来像这样,因为它们的共同点是相同的clinicId,我该怎么做?要向invitations对象插入新密钥clinics吗?:

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"
        },
      }
    }
  },
}

谢谢!

3 个答案:

答案 0 :(得分:1)

我认为这就是您要寻找的https://jsfiddle.net/q4rt6zad/10/

Object.getOwnPropertyNames(upcomingClinics.clinics).forEach((clinicId) => {
  upcomingClinics.clinics[clinicId].invitations = {};
  Object.getOwnPropertyNames(upcomingClinics.invitations).forEach((id) => {
    const invite = upcomingClinics.invitations[id];
    if (invite.clinicId === clinicId) {
      upcomingClinics.clinics[clinicId].invitations[id] = invite;
    }
  });
});
delete upcomingClinics.invitations;

答案 1 :(得分:1)

只需循环invitations对象,并为每个邀请检查其诊所是否已包含在upcomingClinics对象中,如果是,则只需将此邀请添加到其invitations对象中,否则,在upcomingClinics中创建新的诊所记录,然后将当前邀请插入其invitations对象中:

let result = Object.keys(upcomingClinics.invitations).reduce(function(result, invitationId) {   // for each invitationId in upcomingClinics.invitations object
    let invitation = upcomingClinics.invitations[invitationId];                    // get the current invitation object
    let clinicId = invitation.clinicId;                                            // get its clinicId
    if(!result[clinicId]) {                                                        // if there is no record of this clinic in the result object
        result[clinicId] = Object.create(upcomingClinics.clinics[clinicId]);       // create one by cloning the clinic object from upcomingClinics.clinics
        result[clinicId].invitations = {};                                         // create an object that will hold its invitations
    }
    result[clinicId].invitations[invitationId] = invitation;                       // add the current invitation to its corresponding clinic object
    return result;
}, {});

示例:

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"}}};

let result = Object.keys(upcomingClinics.invitations).reduce(function(result, invitationId) {
    let invitation = upcomingClinics.invitations[invitationId];
    let clinicId = invitation.clinicId;
    if(!result[clinicId]) {
        result[clinicId] = Object.create(upcomingClinics.clinics[clinicId]);
        result[clinicId].invitations = {};
    }
    result[clinicId].invitations[invitationId] = invitation;
    return result;
}, {});

console.log(result);

答案 2 :(得分:1)

const clinics = {};

for (let clinicId in upcomingClinics.clinics) {
  clinics[clinicId] = upcomingClinics.clinics[clinicId];
  clinics[clinicId].invitations = {};
  for (let invitId in upcomingClinics.invitations) {
    const invitation = upcomingClinics.invitations[invitId];
    if (invitation.clinicId === clinicId) {
      clinics[clinicId].invitations[invitId] = invitation;
    }
  }
}

https://jsfiddle.net/bg6srahq/