Obtengo un valor booleano falso cuando cada objeto tiene un nombre como propiedad. Consolé la prop var y obtuve 0 de vuelta. ¿Qué estoy haciendo mal y por qué no se repite en todos los objetos?
function truthCheck(collection, pre) { for (let prop in collection) { console.log(prop) if (collection[prop].hasOwnProperty(pre) && Boolean(collection.forEach((item) => item[pre]))) { return true } else return false } } console.log(truthCheck([{ name: "Quincy", role: "Founder", isBot: false }, { name: "Naomi", role: "", isBot: false }, { name: "Camperbot", role: "Bot", isBot: true }], "name"))Está devolviendo un boolean para que el bucle nunca pase de la primera iteración. Use Array.some o Array.every para verificar varios elementos y regresar desde ese contexto.
También use un bucle for of para tener un acceso más fácil a los elementos.
No estoy seguro exactamente de qué lógica desea con la prueba booleana forEach interna, así que la eliminé y solo probé la propiedad definida. Este fragmento debería orientarlo en la dirección correcta, pero agréguelo a esa lógica si desea probar una cadena vacía, etc.
Finalmente, agregué un valor allPassed que ahora se devuelve desde la función para que pueda rastrear si algún elemento falló.
function truthCheck(collection, pre) { let allPassed = true for (let item of collection) { console.log(item) if (item.hasOwnProperty(pre)) { console.log(true) } else { console.log(false) allPassed = false } } return allPassed } console.log(truthCheck([{ name: "Quincy", role: "Founder", isBot: false }, { name: "Naomi", role: "", isBot: false }, { name: "Camperbot", role: "Bot", isBot: true }, { role: "No Name", isBot: true }], "name"))¿Por qué no se repite sobre cada objeto?
Porque return detiene la ejecución de la función. Tiene un return en ambas ramas ( if y else ), por lo que finaliza la función después del primer elemento de collection .
¿Qué estoy haciendo mal?
El return desde arriba y está recorriendo todos los elementos de la colección (en el peor de los casos) "dos veces" (en realidad es collection.length * collection.length veces). Una vez con for...in y una vez con collection.every() .
Para determinar si todos los elementos de collection tienen una propiedad específica, y si esa propiedad tiene un valor real , solo necesita una versión ligeramente modificada de la condición if :
collection.every(item => item.hasOwnProperty(pre) && item[pre]) function truthCheck(collection, pre) { return collection.every(item => item.hasOwnProperty(pre) && item[pre]); } const input = [ { name: "Quincy", role: "Founder", isBot: false }, { name: "Naomi", role: "", isBot: false }, { name: "Camperbot", role: "Bot", isBot: true } ]; const result = truthCheck(input, "name"); console.log(result);Aquí está mi versión del código:
let istruthCheck = (arr, pre) => { return arr.every( item => item.hasOwnProperty(pre) ) } const arr = [ {name: "Quincy", role: "Founder", isBot: false}, {name: "Naomi", role: "", isBot: false}, {name: "Camperbot", role: "Bot", isBot: true} ]; console.log( istruthCheck(arr, "name") )Espero eso ayude... :)