Codificador muy novato aquí y actualmente estoy aprendiendo JavaScript. Estoy tratando de ejecutar un código Object.keys() para devolver las 'habilidades' de las personas en el Objeto de los usuarios y encontrar quién tiene más habilidades según el resultado. Cuando ejecuto mi código, sigo recibiendo "Error de tipo no detectado: no se pueden leer las propiedades de undefined (leyendo 'habilidades')". No tengo idea de cómo acceder a los valores de la clave de habilidades sin buscar a cada usuario individualmente. Aquí está el código con el que estoy trabajando:
const users = { Alex: { email: 'alex@alex.com', skills: ['HTML', 'CSS', 'JavaScript'], age: 20, isLoggedIn: false, points: 30 }, Asab: { email: 'asab@asab.com', skills: ['HTML', 'CSS', 'JavaScript', 'Redux', 'MongoDB', 'Express', 'React', 'Node'], age: 25, isLoggedIn: false, points: 50 }, } const names = Object.keys(users) const userSkills = Object.keys(users.names.skills) console.log(userSkills) //The above doesn't work, however this does: const alexSkills = Object.keys(users.Alex.skills) console.log(alexSkills) //3 const asabSkills = Object.keys(users.Asab.skills) console.log(asabSkills) //8 (console.log(Object.keys(users.Alex.Skills)) //alternate format I've used, but I'm asked to do the former.)¿Hay alguna manera de acceder y mostrar la clave de habilidades en la que no tenga que buscar cada propiedad individualmente para encontrarlas? Sé que obtendré la respuesta con la búsqueda individual, pero hacer esto para un objeto con una gran cantidad de propiedades llevaría demasiado tiempo y me gustaría aprender un método más rápido. ¡Cualquier ayuda es apreciada!
Hay muchas maneras de hacerlo y usemos Object.keys y un solo bucle for para hacerlo.
const keys = Object.keys(users); for(let i=0; i<keys.length; i++){ let user = keys[i]; //Alex or Asab let skills = users[user].skills; let skill_count = skills.length; console.log(`${user} has ${skill_count} skills.`) }Debe tener cuidado con las claves que está usando y cómo usa el valor devuelto por Object.keys (que será una matriz).
Si simplemente recorre cada lista de habilidades para cada usuario, la complejidad temporal del algoritmo será O(m*n), donde m representa la cantidad de usuarios y n representa la cantidad de habilidades por usuario.
Si desea que la búsqueda de una habilidad sea más eficiente, puede mantener ordenadas las listas de habilidades y luego usar un algoritmo de búsqueda para encontrar la habilidad.
const users = { Alex: { email: 'alex@alex.com', skills: ['HTML', 'CSS', 'JavaScript'], age: 20, isLoggedIn: false, points: 30 }, Asab: { email: 'asab@asab.com', skills: ['HTML', 'CSS', 'JavaScript', 'Redux', 'MongoDB', 'Express', 'React', 'Node'], age: 25, isLoggedIn: false, points: 50 }, } const names = Object.keys(users) console.log(names) // 'Alex', 'Asab' const userSkills = users[names[0]].skills.join(', ') console.log(userSkills) // 'HTML, CSS, JavaScript' function getUserSkills(user) { return users[user].skills.join(', ') } console.log(getUserSkills('Alex')) // 'HTML, CSS, JavaScript' function usersWithSkill(users, skill) { const userNames = Object.keys(users) const result = [] for(let x = 0; x < userNames.length; x++) { const currentUser = users[userNames[x]] const currentUserSkills = currentUser.skills for(let y = 0; y < currentUserSkills.length; y++) { if(currentUserSkills[y] === skill) { result.push(userNames[x]) break } } } return result.length ? result.join(', ') : 'Skill not found' } console.log(usersWithSkill(users, 'CSS')) // 'Alex, Asab' console.log(usersWithSkill(users, 'MongoDB')) // 'Asab' console.log(usersWithSkill(users, 'C')) // 'Skill not found'