No puedo entender por qué la salida es 17, solo devuelve los valores verdaderos, no los valores falsos, o que el valor falso también es booleano.
function countSheeps() { const array1 = [true, true, true, false, true, true, true, true, true, false, true, false, true, false, false, true, true, true, true, true, false, false, true, true] return array1.filter(Boolean).length; }la salida es 17
Boolean devuelve true si su argumento es verdadero y false en caso contrario. Array#filter solo mantiene los valores para los que la devolución de llamada devuelve true (o un valor verdadero). Aquí, Boolean es la devolución de llamada y dado que todos los valores en la matriz ya son booleanos, solo se conservan los valores true . Si desea mantener todos los valores que son booleanos primitivos, puede usar typeof en una función de devolución de llamada personalizada.
const array1 = [true, true, true, false, true, true, true, true , true, false, true, false, true, false, false, true , true, true, true, true , false, false, true, true] console.log(JSON.stringify(array1.filter(Boolean))); console.log([true, true, false, true, false, 1, "test"] .filter(x => typeof x === 'boolean'));Array.prototype.filter() funciona evaluando el valor devuelto que se le da en cada iteración. Se devolverá una nueva matriz, pero solo los valores/iteraciones donde se devolvió un valor verdadero en el bloque. Consulte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Ahora eche un vistazo a lo que hace esa función Boolean : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean
Esencialmente, está pasando todos los valores de array1 a filter , y para cada una de esas iteraciones está devolviendo el valor devuelto al llamar a esa función Boolean con el elemento en cuestión. Cuando pasa true a esa función, devuelve true , por lo que ese valor terminará en la matriz devuelta por el método de filter . Cuando pasa false , la función booleana devuelve false en el bloque para filter , lo que significa que el método de filter NO incluirá ese valor en su valor de retorno.
console.log(Boolean(true)); // This returns true, so all these values from array1 end up in the final array that filter returns. console.log(Boolean(false)); // This returns false, which means for that iteration you're returning a falsey value to the filter method, therefore filter will not keep select/keep the element in question.método de matriz de filtro: Filtra la matriz en función de la condición proporcionada en el interior.
arr = [1,2,3,4,5,6]; arr.filter(ele => ele>3) output: Array(3) [ 4, 5, 6 ]Boolean: Boolean devuelve verdadero si el valor es verdadero
Boolean(true) output: trueY viceversa
Boolean(false) output: falseAquí está verificando Boolean (verdadero), en caso de valor verdadero, está contando, pero en caso de falso, está filtrando. Para corregir este escenario, use la verificación de tipos dentro de la función de filtro.
function countSheeps() { const array1 = [true, true, true, false, true, true, true, true, true, false, true, false, true, false, false, true, true, true, true, true, false, false, true, true] return array1.filter(item => typeof(item)==='boolean').length; }