Estoy haciendo un desafío de freecodecamp y me piden que termine de escribir una función que devuelva verdadero si el objeto pasado contiene los cuatro nombres: 'Alan' 'Jeff' 'Ryan' 'Sarah'. un objeto se define anteriormente, que contiene los datos:
let users = { Alan: { age: 27, online: true }, Jeff: { age: 32, online: true },etc. la función comienza así
function isEveryoneHere(userObj) {}y tengo esto escrito como mi función completa, en la que puedo devolver los 4 nombres:
for (const property in userObj) { if (userObj) { return userObj.hasOwnProperty(property) }Pero todavía me dicen que no cumplo con los criterios del desafío. ¿Algún consejo o consejo?
editar: Mensaje de error No se debe acceder directamente al objeto de los usuarios
Aprobado El objeto de los usuarios solo debe contener las claves Alan, Jeff, Sarah y Ryan
Aprobado La función isEveryoneHere debería devolver verdadero si Alan, Jeff, Sarah y Ryan son propiedades del objeto que se le pasa.
La función isEveryoneHere debería devolver falso si Alan no es una propiedad en el objeto que se le pasa.
La función isEveryoneHere debería devolver false si Jeff no es una propiedad del objeto que se le pasa.
La función isEveryoneHere debería devolver falso si Sarah no es una propiedad en el objeto que se le pasa.
La función isEveryoneHere debería devolver falso si Ryan no es una propiedad en el objeto que se le pasó
editar:
asi lo resolvieron
function isEveryoneHere(userObj) { if ( userObj.hasOwnProperty("Alan") && userObj.hasOwnProperty("Jeff") && userObj.hasOwnProperty("Sarah") && userObj.hasOwnProperty("Ryan") ) { return true; } return false; }Probablemente haría algo como
let users = { Alan: { age: 27, online: true }, Jeff: { age: 32, online: true }, } function check(userObj) { return ['Alan', 'Jeff', 'Ryan', 'Sarah'].every(user => userObj.hasOwnProperty(user)); } function check2(userObj) { return ['Alan', 'Jeff', 'Ryan', 'Sarah'].every(user => Object.keys(userObj).includes(user)); } console.log('check: ' + check({ Jeff: 1, Alan: 2, Ryan: 3, Sarah: 4 })); console.log('check2: ' + check2({ Jeff: 1, Alan: 2, Ryan: 3, Sarah: 4 })); console.log('Should fail (check): ' + check(users)); console.log('Should fail (check2): ' + check2(users));ambas variantes deben satisfacer todos los criterios, excepto el de que no se debe acceder directamente al objeto. No estoy seguro de lo que quieren decir con eso, pero el segundo transforma las claves en una matriz, así que tal vez eso es lo que están buscando, aunque es ineficiente.
La especificación describe incluye la función como búsqueda lineal. Entonces, cuando lo use en cualquier ciclo, aumentará su complejidad de tiempo en el peor de los casos a n * 2 . Si necesita verificar la existencia de un nombre, puede usar Establecer aquí, que está optimizado para una verificación de existencia.
Para hacer una solución optimizada, puede usar Establecer aquí
let users = { Alan: { age: 27, online: true }, Jeff: { age: 32, online: true }, Sarah: { age: 48, online: true }, Ryan: { age: 19, online: true } }; function isEveryoneHere(userObj) { const nameDict = ['Alan', 'Jeff', 'Sarah', 'Ryan']; const keys = new Set(Object.keys(userObj)); return nameDict.every(name => keys.has(name)) } console.log(isEveryoneHere(users));Corrí esto a través del enlace y pasó
let users = { Alan: { age: 27, online: true }, Jeff: { age: 32, online: true }, Sarah: { age: 48, online: true }, Ryan: { age: 19, online: true } }; function isEveryoneHere(userObj) { const names = ['Alan', 'Jeff', 'Ryan', 'Sarah']; const keys = Object.keys(userObj); for (let name in names) { if (!(name in keys)) { return false; } } return true; } console.log(isEveryoneHere(users)); Recorre cada nombre en names y verifica si el objeto de los users contiene una clave que es equivalente a ese nombre. Si algún nombre no está en keys , devuelve false . De lo contrario, devuelve true .