Tengo una matriz de objetos en el siguiente formulario, tiene tres propiedades serviceName, pool y environment. Quiero agrupar el objeto según el entorno y, al mismo tiempo, necesito concatenar los pools:
const data = [ { serviceName: "visa", pool: "3g", environment: "test-int", }, { serviceName: "visa", pool: "4g", environment: "test-int", }, { serviceName: "visa", pool: "5g", environment: "test-int", }, { serviceName: "amex", pool: "5g", environment: "dev", }, { serviceName: "amex", pool: "6g", environment: "dev", }, ];Quiero la salida en el siguiente formato:
const output = [ { serviceName: "visa", pool: "3g,4g,5g", environment: "test-int" }, { serviceName: "amex", pool: "5g,6g", environment: "dev" }, ]Según mi código actual, solo devuelve un solo objeto en lugar de una matriz de objetos:
const output = data.reduce((acc, ar) => { let res = { ...acc, pool: acc["pool"] + "," + ar.pool }; return res; } });Creo que el problema básico es que necesita segmentar todos los elementos que coinciden por serviceName y luego hacer su reducción para unir el valor del pool .
Tal vez algo como esto:
const res = [ { serviceName: "visa", pool: "3g", environment: "test-int" }, { serviceName: "visa", pool: "4g", environment: "test-int" }, { serviceName: "amex", pool: "5g", environment: "dev" }, { serviceName: "amex", pool: "6g", environment: "dev" } ]; const groupBy = (arr, getKey) => { return arr.reduce((memo, item) => { const key = getKey(item) memo[key] ||= []; memo[key].push(item); return memo; }, {}) } const byServiceName = groupBy(res, ({serviceName}) => serviceName); const results = Object.values(byServiceName).map((items) => { return items.reduce((acc, item) => { let res = { ...acc, pool: acc["pool"] + "," + item.pool }; return res; }) }); console.log(results) La función groupBy podría simplificarse para no tomar la función getKey , pero eso agrega un poco de flexibilidad. Si sabe que siempre estará en serviceName, podría tener algo como
const groupByServiceName = (arr) => { const key = 'serviceName' return arr.reduce((memo, item) => { memo[key] ||= []; memo[key].push(item); return memo; }, {})Aquí hay un método que genera un objeto con valor de environment como clave y luego extrae sus valores en una matriz
const data = [ { serviceName: "visa", pool: "3g", environment: "test-int", }, { serviceName: "visa", pool: "4g", environment: "test-int", }, { serviceName: "visa", pool: "5g", environment: "test-int", }, { serviceName: "amex", pool: "5g", environment: "dev", }, { serviceName: "amex", pool: "6g", environment: "dev", }, ]; const output = Object.values(data.reduce((acc, ar) => { if (acc[ar.environment]) acc[ar.environment].pool += "," + ar.pool; else acc[ar.environment] = {...ar}; return acc; },{})); console.log(output);