¿Cómo puedo escribir una función que, al recibir a matriz ya dada del programa que puede contener números, booleanos e incluso otras matrices, cuente cuántos números están presentes en a ?
Aquí está mi código que no funciona (cada vez que da 0, independientemente de lo que contenga la matriz):
function test(a) { var sum = 0 for (i=0; i<a.length; i++){ if (typeof a[i]==Number) sum++ } return sum }Gracias.
puedes probar esto:
const array = ["Hi", true, 10, "Car", 20, 50, 1500, false]; const flatedArray = array.flat(Infinity); const count = flatedArray.filter(x => typeof x == 'number').length; console.log(count) // 4o cambia tu código:
function test(a) { const flatedArray = a.flat(Infinity); let sum = 0 for (i = 0; i < flatedArray.length; i++) { if (typeof a[i] == 'number') { sum++ } } return sum } const array = ["Hi", true, 10, "Car", 20, 50, 1500, false]; console.log(test(array)) // 4o cambiar su función:
function test(a) { const flat = a.flat(Infinity); return a.filter(x => typeof x == 'number').length; } const array = ["Hi", true, 10, "Car", 20, 50, 1500, false]; console.log(test(array)) // 4Tienes algunos problemas:
typeof <operand> devuelve una cadena y no un objeto, debe verificar con una cadena typeof a[i] === "number" .var / let antes de i en su bucle for para que i no se convierta en una variable global y, en cambio, permanezca dentro del alcance de su función (si usa var ) o su bucle for (si usa let ). Tener variables añadidas accidentalmente al alcance global puede conducir fácilmente a errores en el código que se ejecuta después de llamar a la función test() . Como desea contar la frecuencia de los números tanto en su matriz como en las matrices anidadas, puede usar la recursividad. La idea es volver a llamar a la función test() dentro de test() cuando encuentre una matriz:
function test(a) { let sum = 0; for (let i = 0; i < a.length; i++) { if (typeof a[i] === "number") sum++ else if(Array.isArray(a[i])) sum += test(a[i]); // sum the numbers within the `a[i]` array } return sum; } console.log(test([1,4, [2, 3, true], ["foo",0], 5, [123, [3.14, {a: 1}]]])); // 8 La otra opción es hacer que JS maneje la recursividad por usted, lo cual se puede hacer con la ayuda del método .flat() . Al usar .flat(Infinity) , primero puede aplanar su matriz (es decir, eliminar las matrices internas de cualquier nivel) y luego recorrerla:
function test(a) { let sum = 0; let flat = a.flat(Infinity); for (let i = 0; i < flat.length; i++) { if (typeof flat[i] === "number") sum++; } return sum; } console.log(test([1,4, [2, 3, true], ["foo",0], 5, [123, [3.14, {a: 1}]]])); // 8