Básicamente, lo que estoy tratando de hacer es mapear esta matriz e identificar qué objetos satisfacen una determinada condición. La condición es: Obtenga un objeto que tenga el valor más alto de a+b y si tiene dos objetos con el mismo valor de a+b, obtenga el que tenga el valor más alto de c. ¿Cuál es la mejor manera de hacer esto? ¿Quizás reducir?
const data = [ { id: 1, a: 12, b: 75, c: 11, }, { id: 2, a: 65, b: 14, c: 32, }, { id: 3, a: 32, b: 23, c: 45, }, { id: 4, a: 22, b: 1, c: 3, }, ];Un bucle for simple debería funcionar. Recorra la matriz y si a + b del objeto actual es mayor que un objeto almacenado, sobrescriba el objeto almacenado con el objeto de bucle actual, verificando c si es necesario.
Ya es un primer enfoque ingenuo basado en la reduce que implementa los requisitos y restricciones del OP casi literalmente hace exactamente lo que pide el OP.
En caso de que uno no proporcione un valor inicial al reductor, esta función de devolución de llamada reductora pasa los dos primeros elementos de la matriz en su primera invocación. Se supone que la función devuelve un valor que, con cualquier siguiente paso de iteración, se pasará como el primer argumento de la misma función junto con el elemento de matriz procesado actualmente (que es el segundo argumento).
Por lo tanto, para el caso de uso del OP, solo se necesita implementar la comparación correcta que siempre garantiza el valor de retorno esperado ...
function getItemWithHighestTotal(result, item) { const resultTotal = result.a + result.b; const itemTotal = item.a + item.b; return ( ((resultTotal > itemTotal) && result) || ((resultTotal < itemTotal) && item) || ((result.c < item.c) && item) || // OP did not define the clause where // even both `c` values are equal. result ); } console.log( [{ id: 1, a: 12, b: 75, c: 11, }, { id: 2, a: 65, b: 14, c: 32, }, { id: 3, a: 32, b: 23, c: 45, }, { id: 4, a: 22, b: 1, c: 3, }].reduce(getItemWithHighestTotal) ); console.log( [{ id: 1, a: 12, b: 75, c: 11, }, { id: 2, a: 65, b: 14, c: 32, }, { id: 3, a: 32, b: 23, c: 45, }, { id: 4, a: 22, b: 1, c: 3, }, { id: 5, a: 75, b: 12, c: 12, }].reduce(getItemWithHighestTotal) ); .as-console-wrapper { min-height: 100%!important; top: 0; }Un bucle for simple sería genial
const data = [ { id: 1, a: 12, b: 75, c: 11, }, { id: 2, a: 65, b: 14, c: 32, }, { id: 3, a: 32, b: 23, c: 45, }, { id: 4, a: 22, b: 1, c: 3, }, ]; let index, cHigh = Number.MIN_SAFE_INTEGER, total = Number.MIN_SAFE_INTEGER; for (let i = 0; i < data.length; ++i) { const { a, b, c } = data[i]; if (a + b > total) { total = a + b; index = i; } else if (a + b === total) { if (c > cHigh) { cHigh = c; index = i; } } } console.log(index); console.log(data[index]);