Я пытаюсь преобразовать эту функцию, которая использует 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"
},
}
}
},
}
@charlietfl Я добавил пример кода! Благодарность :)
Lodash - это просто JavaScript, так почему бы не взглянуть на исходный код?
Было бы полезно, если бы вы показали фактический результат, чтобы мы могли сравнить его с ожидаемым.
@Jacob Я показал фактический результат, это третий фрагмент, ожидаемый результат находится в четвертом фрагменте
Хорошо, спасибо за разъяснения.
Похоже, что третий фрагмент - это ввод, а не результат попытки.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша текущая попытка выглядит очень близкой, но я думаю, что у вас есть небольшая опечатка. Этот:
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 будет иметь ключ по идентификатору приглашения:
const getInvitations = clinicId =>
Object.keys(upInvitations).reduce((acc, invId) => {
const inv = upInvitations[invId];
return inv.clinicId === clinicId ? { ...acc, [invId]: inv } : acc;
}, {});
Спасибо @jacob, это именно то, что я искал, в соответствии с этим JSfiddle он отлично работает jsfiddle.net/ba7j2e6z, но как только я меняю код lodash на тот, который вы мне отправляете, у меня эта ошибка TypeError: Cannot convert undefined or null to object, вы знаете, как я могу исправить это?
Вам нужно будет увидеть, в какой строке произошла ошибка. Возможно, один из фрагментов данных не соответствует ожиданиям, и вам придется добавить логику для обработки значений undefined или null.
Далее создается карта всех приглашений, в первую очередь с использованием 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.info(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>
Некоторые образцы данных и ожидаемые результаты были бы полезны