Quiero escribir una función que reciba dos parámetros, el primero es una matriz y el segundo es un número entero; Así que quiero devolver dos elementos de la matriz para que su suma sea igual al parámetro de la segunda función. Por ejemplo, en este caso findSum([1,2,3,5], 5) mi función devolverá 2 y 3 cuya suma es 5. Escribí una función pero creo que puede ser mejor con otra codificación optimizada.
function findSum(arr, sum){ for(element of arr) { const first_element = element; for(innerElement of arr){ if((innerElement !== first_element) && (innerElement + element === sum) ) return {first_element, innerElement} } } }Entonces, un problema claro con su código es que findSum([2,2,3],4) no funcionará, debido a esta línea: if((innerElement !== first_element) . Debe verificar los índices, en lugar de los valores para evitar esto.
Ejemplo muy rápido:
findSum = (arr, sum) => { return arr.map((x, i) => { return arr.map((y, j) => { if(i === j) return null; return x + y === sum ? {x, y} : null; }).filter(x => x); }).flat()[0]; }Esencialmente, lo que estoy haciendo es muy similar a su versión original, con algunos pequeños ajustes.
En lugar de usar dos bucles for como tú, uso dos mapas para iterar sobre la matriz. Esto me da acceso al índice (i & j).
Si i === j , entonces es exactamente el mismo elemento (y no solo el mismo valor), por lo que podemos ignorarlo. Esto resuelve el problema if((innerElement !== first_element) .
Luego verifico si la suma es correcta y devuelvo los valores, o nulo si es incorrecto. Filtrar esta matriz con filter(x => x) devuelve solo los elementos verdaderos, es decir, elimina los valores nulos, por lo que nos quedan todas las coincidencias.
Luego aplanamos la matriz y devolvemos el primer objeto, ya que eso es todo lo que necesitamos, pero podríamos cambiar eso para devolver todas las coincidencias. findSum([2,2,1,3], 4) tiene dos coincidencias, por ejemplo.
Conceptos clave: Array.map Array.filter Array.flat