Tengo debajo de la matriz de objetos con vertical como cadena y projects como matriz de objetos dentro de ella. projects también puede estar vacío. Cada entrada projects si no está vacía, tendrá name y releaseType como propiedades.

[
  {
    "vertical": "Alpha",
    "projects": [
      {
        "name": "Test",
        "releaseType": ""
      }
    ]
  },
  {
    "vertical": "Beta",
    "projects": []
  },
  {
    "vertical": "Gamma",
    "projects": [
      {
        "name": "Lincoln",
        "releaseType": "Google Pay"
      },
      {
        "name": "Madison",
        "releaseType": "PayPal"
      }
    ]
  }
]

Quiero obtener la lista de proyectos en Formato a continuación. Puede alguien, por favor hágamelo saber cómo lograr esto. Este no es un método de filtro regular, pero requiere un poco de manipulación usando el mapa. Probé pocas cosas, pero no pude lograr el resultado esperado.

[
  {
    "vertical": "Alpha",
    "feature": "Test",
     "releaseType": ""
  },
  {
    "vertical": "Gamma",
    "feature": "Lincoln",
     "releaseType": "Google Pay"
   },
   {
     "vertical": "Gamma",
     "feature": "Madison",
     "releaseType": "PayPal"
   }
]
0
Aren Trot 8 jun. 2021 a las 17:49

4 respuestas

La mejor respuesta

Doble FlatMap , debería resolver esto muy bien:

const input = [{vertical:"Alpha",projects:[{name:"Test",releaseType:""}]},{vertical:"Beta",projects:[]},{vertical:"Gamma",projects:[{name:"Lincoln",releaseType:"Google Pay"},{name:"Madison",releaseType:"PayPal"}]}];

const res = input.flatMap(e => 
  e.projects.flatMap(x => [{vertical: e.vertical, ...x}])
)

console.log(res)
.as-console-wrapper { max-height: 100% !important; top: 0; } /* ignore this */
1
ulou 8 jun. 2021 a las 14:57

Puedes usar reduce para resolverlo

arr.reduce((pre, cur) => {
  if (cur.projects.length) {
    pre.push(...cur.projects.map(p => ({
      vertical: cur.vertical,
      feature: p.name,
      releaseType: p.releaseType,
    })))
  }

  return pre;
}, []);
3
Khanh Chau 8 jun. 2021 a las 14:58

Puede usar Array.reduce para esto

let formattedProjects = arr.reduce((p, c, i, a) => {
    if (c.projects.length) {
        p = p.concat(c.projects.map(project => {
            return {
                vertical: c.vertical,
                feature: project.name,
                releaseType: project.releaseType
            }
        }));
    }

    return p;
}, []);

Demo: https://jsfiddle.net/6zk8jhat/

1
tymeJV 8 jun. 2021 a las 14:53
let arr = [
  {
    vertical: "Alpha",
    projects: [
      {
        name: "Test",
        releaseType: "",
      },
    ],
  },
  {
    vertical: "Beta",
    projects: [],
  },
  {
    vertical: "Gamma",
    projects: [
      {
        name: "Lincoln",
        releaseType: "Google Pay",
      },
      {
        name: "Madison",
        releaseType: "PayPal",
      },
    ],
  },
];

arr = arr
  .map((obj) => {
    return obj.projects.map((proj) => {
      return {
        vertical: obj.vertical,
        ...proj,
      };
    });
  })
  .flat();
1
Long Vu 8 jun. 2021 a las 15:15