Es la primera vez que hago una pregunta aquí, así que pido disculpas si la pregunta se ha repetido antes.
Esta es mi solución oficial para el problema de freeCodeCamp JS:
const contacts = [ { firstName: "Akira", lastName: "Laine", number: "0543236543", likes: ["Pizza", "Coding", "Brownie Points"], }, { firstName: "Harry", lastName: "Potter", number: "0994372684", likes: ["Hogwarts", "Magic", "Hagrid"], }, { firstName: "Sherlock", lastName: "Holmes", number: "0487345643", likes: ["Intriguing Cases", "Violin"], }, { firstName: "Kristian", lastName: "Vos", number: "unknown", likes: ["JavaScript", "Gaming", "Foxes"], }, ]; function lookUpProfile(name, prop) { for(let i = 0; i<contacts.length;i++){ if(contacts[i].firstName == name && contacts[i].hasOwnProperty(prop)){ return contacts[i][prop]; } else { return "No such property" } } return "No such contact"; } console.log(lookUpProfile("Kristian", "lastName")); //Output: No such propertyY esta es la solución oficial con cambios en el ciclo 'anidado si':
function lookUpProfile(name, prop) { for(let i = 0; i<contacts.length;i++){ if(contacts[i].firstName == name){ if(contacts[i].hasOwnProperty(prop)){ return contacts[i][prop]; } else { return "No such property" } } } return "No such contact"; } console.log(lookUpProfile("Kristian", "lastName")); //Output: Vos¿Por qué obtengo soluciones diferentes incluso si la lógica detrás de anidado-si en la solución oficial es similar a la mía?
No son lógicamente lo mismo.
El suyo es este:
for (/*...*/) { if (a) { if (b) { return X; } else { return Y; } } } Tenga en cuenta que si a no es cierto, no se produce ningún return y el ciclo continúa con la siguiente iteración.
Pero el tuyo es:
for (/*...*/) { if (a && b) { return X; } else { return Y; } } Vuelve incluso cuando a es falso, sin pasar nunca a la siguiente iteración del ciclo.
Si quisieras combinar la prueba exterior con las interiores, sería:
for (/*...*/) { if (a && b) { return X; } else if (a) { // <=== return Y; } } Pero eso no es tan claro como a original, y termina probando dos veces innecesariamente.