Intenté determinar el segundo número más grande en una matriz (Javascript) en CodeSandbox. Parece funcionar bien, pero falla en las pruebas de CodeWars. Agregué una matriz ficticia solo para ejecutar mis propias pruebas en Sandbox. (Ten piedad, soy un principiante y esta es mi primera pregunta de StackOverFlow)
const nums = [3, 100.3, 88, 1, -2.4, 9, 18]; const getSecondLargest = (nums) => { const descending = nums.sort((a, b) => b - a); return descending[1]; }; console.log(getSecondLargest(nums)); // console returns 88EDITAR: De acuerdo, con mi cerebro súper cansado dije CodeWars, cuando en realidad me refería a Hackerrank (¡lo siento mucho!). Me di cuenta de que no necesariamente probaron con NaN, pero tenían números repetidos, por lo que usar el índice de [1] no es lo ideal. El ejercicio es de los 10 Días de Javascript - Día 3: Matrices https://hackerrank.com/domains/tutorials/10-days-of-javascript
Así que ahora probé este código a continuación, y pasa ... pero mi código parece un poco raro, ¿hay una forma más limpia de escribir esto y puedo combinarlo con la lógica isNan entonces?
const nums = [3, 100, 88, 100, -2.4, 9, 18]; const getSecondLargest = (nums) => { const ascending = nums.sort((a, b) => a - b); if (ascending[ascending.length - 2] === ascending[ascending.length - 1]) { return ascending[ascending.length - 3]; } else { return ascending[ascending.length - 2]; } }; console.log(getSecondLargest(nums)); // console returns 88Parece que tal vez haya cadenas en la matriz y debe manejar eso. Aquí hay algunas maneras:
Una es filtrar las cosas no numéricas antes de clasificarlas. Puede usar isNaN() para probar si un objeto "no es un número".
const getSecondLargest = (nums) => { const descending = nums .filter(n => !isNaN(n)) .sort((a, b) => b - a); return descending.length < 2 ? undefined : descending[1]; };Otra opción es manejar las cadenas en la clasificación. Empújelos hasta el final de la matriz:
const getSecondLargest = (nums) => { const descending = nums.sort((a, b) => { if (isNaN(a) && isNaN(b)) return 0; if (isNaN(a)) return 1; if (isNaN(b)) return -1; return b - a; }); return descending.length < 2 || isNaN(descending[1]) ? undefined : descending[1]; }; Una tercera forma es un bucle for simple que realiza un seguimiento de los 2 valores más altos:
const getSecondLargest = (nums) => { let max1 = undefined; let max2 = undefined; for (let n of nums) { if (isNaN(n)) continue; if (max2 === undefined || n > max2) { if (max1 === undefined || n > max1 ) { max2 = max1; max1 = n; } else { max2 = n; } } } return max2; }