Преобразование pickBy и mapValues ​​из lodash в функцию

Я пытаюсь преобразовать эту функцию, которая использует 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 19.07.2018 01:04

@charlietfl Я добавил пример кода! Благодарность :)

Liz Parody 19.07.2018 01:11

Lodash - это просто JavaScript, так почему бы не взглянуть на исходный код?

Phil 19.07.2018 01:11

Было бы полезно, если бы вы показали фактический результат, чтобы мы могли сравнить его с ожидаемым.

Jacob 19.07.2018 01:13

@Jacob Я показал фактический результат, это третий фрагмент, ожидаемый результат находится в четвертом фрагменте

Liz Parody 19.07.2018 01:14

Хорошо, спасибо за разъяснения.

Jacob 19.07.2018 01:14

Похоже, что третий фрагмент - это ввод, а не результат попытки.

Jacob 19.07.2018 01:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
507
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша текущая попытка выглядит очень близкой, но я думаю, что у вас есть небольшая опечатка. Этот:

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, вы знаете, как я могу исправить это?

Liz Parody 19.07.2018 03:52

Вам нужно будет увидеть, в какой строке произошла ошибка. Возможно, один из фрагментов данных не соответствует ожиданиям, и вам придется добавить логику для обработки значений undefined или null.

Jacob 19.07.2018 18:00

Далее создается карта всех приглашений, в первую очередь с использованием 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>

Другие вопросы по теме