Tengo una matriz de objetos que quiero agrupar/fusionar los objetos que tienen ramas y entornos similares y concatenar sus grupos al mismo tiempo.
const data = [ { branch: "master", environment: "dev", pool: "6g", service: "amex", }, { branch: "master", environment: "dev", pool: "6g", service: "amex", }, { branch: "feature/rest", environment: "dev", pool: "2g", service: "amex", }, { branch: "master", environment: "dev", pool: "4g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "9g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "1g", service: "amex", }, ];Quiero el resultado en el siguiente formato eliminando objetos duplicados también. Traté de reducirlo, pero como matriz reduce devuelve un solo objeto como resultado y los otros objetos se omiten de la respuesta, qué estructura de datos o forma puedo usar para lograr el ¿resultado?
const result = [ { branch: "master", environment: "dev", pool: "6g, 4g", service: "amex", }, { branch: "feature/rest", environment: "dev", pool: "2g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "9g,1g", service: "amex", }, ]; const data = [{ branch: "master", environment: "dev", pool: "6g", service: "amex", }, { branch: "feature/rest", environment: "dev", pool: "2g", service: "amex", }, { branch: "master", environment: "dev", pool: "4g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "9g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "1g", service: "amex", }, ]; var cacheMix = {}; for (var i = 0; i < data.length; i++) { var item = data[i]; var compositeKey = item.environment + "~" + item.branch; if (cacheMix[compositeKey]) { cacheMix[compositeKey].pools[item.pool] = 1; } else { var pools = {}; pools[item.pool] = 1; //to avoid dublicate pools cacheMix[compositeKey] = { branch: item.branch, environment: item.environment, service: item.service, pools: pools } } } var result = []; for (var key in cacheMix) { var item = cacheMix[key]; result.push({ branch: item.branch, environment: item.environment, service: item.service, pool: Object.keys(item.pools).join(", ") }); } console.log(result);Simplemente cree un diccionario a partir de ellos y complete los valores.
const data=[{branch:"master",environment:"dev",pool:"6g",service:"amex"},{branch:"feature/rest",environment:"dev",pool:"2g",service:"amex"},{branch:"master",environment:"dev",pool:"4g",service:"amex"},{branch:"hotfix/23",environment:"test",pool:"9g",service:"amex"},{branch:"hotfix/23",environment:"test",pool:"1g",service:"amex"},] let x = {}; data.forEach(y => x[y.branch + "|" + y.environment] = y); var res = Object.values(x).map(y => Object.assign({}, y)).map(y => { y.pool = data.filter(d => d.branch == y.branch && d.environment == y.environment).map(x => x.pool).join(","); return y; }) Si no le importa la inmutabilidad (objetos originales en el cambio de datos), elimine Object.assign map y obtendrá los mismos resultados
data.reduce((prev, curr) => { const container = prev.find( el => (el.branch === curr.branch) && (el.environment === curr.environment) ); if (container) { container.pool = container.pool + `,${curr.pool}` return prev; } else { return prev.concat({...curr}) } }, []) pero sugeriría crear un objeto con la key s igual a los nombres de las ramas.