Tengo el siguiente fragmento que usa una reduce y no puedo usar otro tipo de bucles, tengo como requisito resolver esto mediante una reduce o una forma que no incluya un bucle como for o forEach
Como verá, tengo una matriz de objetos y, dentro de ella, tengo 2 objetos con el mismo studyId .
Lo que necesito es fusionar los objetos con el mismo studyId de estudio y los ID de sitio del siteIds en una matriz para obtener el siguiente resultado
{ studyId: "ANNO5", siteIds: ["Paris", "Bon", "PLACEHOLDER", "Amsterdam", "Bruxelles" ] } Los siteIds de sitio también deben ser únicos. No puedo haber repetido el mismo siteId de sitio en la matriz.
En el fragmento, probé con el reductor ya que lo tengo como requisito, pero no puedo encontrar la manera de lograr el resultado que necesito.
Incluyendo el resultado deseado completo, ya que confundía un supercomentario
[ // Here the merged with the same StudyId { studyId: "ANNO5", siteIds: ["Paris", "Bon", "PLACEHOLDER", "Amsterdam", "Bruxelles", "Paris"] }, { studyId: "ANNO6", siteIds: ["Rome", "Torino", "PLACEHOLDER", "Milano"] }, { studyId: "ANNO7", siteIds: undefined }, { studyId: "ANNO8", siteIds: undefined } ]; según undefined , el requisito es similar a tener algo como esto
siteIds: isEmpty(siteIds) ? undefined : uniq(siteIds), Cuando no hay siteIds , no tenemos definido según el ejemplo anterior
Puede agrupar los datos por studyId de estudio usando reduce y usar Establecer para eliminar los siteIds de sitio duplicados.
const siteIds = [ { studyId: "ANNO5", siteIds: ["Paris", "Bon", "PLACEHOLDER"] }, { studyId: "ANNO5", siteIds: ["Amsterdam", "Bruxelles", "PLACEHOLDER", "Paris"] }, { studyId: "ANNO6", siteIds: ["Rome", "Torino", "PLACEHOLDER", "Milano"] }, { studyId: "ANNO7", siteIds: undefined }, { studyId: "ANNO8", siteIds: undefined }, ]; const result = Object.values( siteIds.reduce((r, o) => { if (!r[o.studyId]) { r[o.studyId] = { ...o, siteIds: undefined }; } if (o.siteIds) { (r[o.studyId].siteIds ??= []).push(...o.siteIds); r[o.studyId].siteIds = [...new Set(r[o.studyId].siteIds)]; } return r; }, {}) ); console.log(result);Si desea evitar la creación de conjuntos en cada iteración, consulte el fragmento a continuación:
const siteIds = [ { studyId: "ANNO5", siteIds: ["Paris", "Bon", "PLACEHOLDER"] }, { studyId: "ANNO5", siteIds: ["Amsterdam", "Bruxelles", "PLACEHOLDER", "Paris"] }, { studyId: "ANNO6", siteIds: ["Rome", "Torino", "PLACEHOLDER", "Milano"] }, { studyId: "ANNO7", siteIds: undefined }, { studyId: "ANNO8", siteIds: undefined }, ]; const result = Object.values( siteIds.reduce((r, o) => { if (!r[o.studyId]) { r[o.studyId] = { ...o, siteIds: undefined }; } if (o.siteIds) { (r[o.studyId].siteIds ??= []).push(...o.siteIds); } return r; }, {}) ).map((o) => ({ ...o, ...(o.siteIds && { siteIds: [...new Set(o.siteIds)] }), })); console.log(result);