Considere lo siguiente como mi matriz de entrada de objetos:
const arr = [ { src: 'x1', dst: 'x2', severity: null}, { src: 'x1', dst: 'x2', severity: null}, { src: 'x1', dst: 'x2', severity: 1}, { src: 'x1', dst: 'x2', severity: 2}, { src: 'x1', dst: 'x2', severity: 3}, { src: 'x1', dst: 'x2', severity: 4}, { src: 'x1', dst: 'x2', severity: 5}, { src: 'x1', dst: 'x2', severity: 6}, { src: 'x1', dst: 'x2', severity: 7}, { src: 'x2', dst: 'x1', severity: null}, { src: 'x2', dst: 'x1', severity: null}, { src: 'x2', dst: 'x1', severity: 5}, { src: 'x2', dst: 'x1', severity: 1}, { src: 'x3', dst: 'x4', severity: null} ];Aquí src, dst y severidad representan el origen, el destino y la severidad de los valores de la matriz. el resultado esperado debería ser como el siguiente:
[ { src: 'x1', dst: 'x2', severity: 7 }, { src: 'x2', dst: 'x1', severity: 5 }, { src: 'x3', dst: 'x4', severity: null } ]Básicamente, tendría que obtener la matriz con src y dst únicos, que también tengan el valor de gravedad más alto, digamos aquí para x1 como src y x2 como destino 7 es el valor de gravedad más alto, por lo tanto, se agrega a la matriz resultante, de manera similar para x2 como dst y x1 como src.
En el caso de x3 como src y x4 como dst, no hay otros valores con x3 como src y x4 como destino, por lo tanto, solo la gravedad disponible es nula, por lo tanto, se agrega a la matriz.
Básicamente, un groupBy con una pequeña transformación para obtener el resultado final y un valor máximo:
const arr = [ { src: 'x1', dst: 'x2', severity: null }, { src: 'x1', dst: 'x2', severity: null }, { src: 'x1', dst: 'x2', severity: 1 }, { src: 'x1', dst: 'x2', severity: 2 }, { src: 'x1', dst: 'x2', severity: 3 }, { src: 'x1', dst: 'x2', severity: 4 }, { src: 'x1', dst: 'x2', severity: 5 }, { src: 'x1', dst: 'x2', severity: 6 }, { src: 'x1', dst: 'x2', severity: 7 }, { src: 'x2', dst: 'x1', severity: null }, { src: 'x2', dst: 'x1', severity: null }, { src: 'x2', dst: 'x1', severity: 5 }, { src: 'x2', dst: 'x1', severity: 1 }, { src: 'x3', dst: 'x4', severity: null }, ]; const res = Object.entries( arr.reduce((p, n) => { const key = n.src + '.' + n.dst; const sev = n.severity ?? 0; if (!p[key]) p[key] = sev; else p[key] = Math.max(p[key], sev); return p; }, {}), ).map(([key, severity]) => ({ src: key.split('.')[0], dst: key.split('.')[1], severity: severity || null })); console.log(res); const arr = [ { src: 'x1', dst: 'x2', severity: null}, { src: 'x1', dst: 'x2', severity: null}, { src: 'x1', dst: 'x2', severity: 1}, { src: 'x1', dst: 'x2', severity: 2}, { src: 'x1', dst: 'x2', severity: 3}, { src: 'x1', dst: 'x2', severity: 4}, { src: 'x1', dst: 'x2', severity: 5}, { src: 'x1', dst: 'x2', severity: 6}, { src: 'x1', dst: 'x2', severity: 7}, { src: 'x2', dst: 'x1', severity: null}, { src: 'x2', dst: 'x1', severity: null}, { src: 'x2', dst: 'x1', severity: 5}, { src: 'x2', dst: 'x1', severity: 1}, { src: 'x3', dst: 'x4', severity: null} ]; var helper = {}; var result = arr.reduce(function(r, o) { var key = o.src + '-' + o.dst; if(!helper[key]) { helper[key] = Object.assign({}, o); // create a copy of o r.push(helper[key]); } else { if( !helper[key].severity){ helper[key].severity = o.severity; }else{ if(o.severity > helper[key].severity ){ helper[key].severity = o.severity; } } } return r; }, []); console.log(result);