Hola, tengo este código simple:
let obj = { games: [ {id: 'test'} ] } console.log(obj.games[0].id) // returns: test console.log('games[0].id' in obj) // returns: false console.log(obj.hasOwnProperty('games[0].id')) // returns: falseNo entiendo el valor devuelto cuando trato de verificar el nombre de su propiedad en lugar de devolver su valor de propiedad.
in y hasOwnProperty() solo toman un solo nombre de propiedad, no aceptan una expresión con propiedades anidadas.
Así que tienes que probar cada nivel por separado.
console.log('games' in obj && 0 in obj.games && "id" in obj.games[0])También puede usar el encadenamiento opcional para combinar todos menos el último cheque.
console.log(obj?.games.?[0] && "id" in obj.games[0])El operador in solo puede probar un único atributo. No es lo suficientemente inteligente como para seguir un camino.
podrías simplemente
const value = obj?.games?.[0]?.id; const exists = value !== undefined; console.log(exists) Más importante aún, en este caso realmente no debería usar el operador in en absoluto. La desventaja del operador in es que requiere que el campo probado se codifique como una cadena.
En general, poner los nombres de los campos en cadenas es algo que se debe evitar, porque hace que sea más difícil encontrar usos y reconstruir el código más adelante.
El uso del operador in solo puede justificarse si el nombre del campo probado no es una constante, no conocida de antemano.
Habiendo dicho eso, la función hasOwnProperty hace algo ligeramente diferente. En realidad, es más estricto que la solución presentada anteriormente y también más estricto que el operador in . Comprueba estrictamente los campos en el objeto en sí, no los de tipo super/base.
El método hasOwnProperty() devuelve verdadero si la propiedad especificada es una propiedad directa del objeto, incluso si el valor es nulo o indefinido. El método devuelve falso si la propiedad se hereda o no se ha declarado en absoluto. A diferencia del operador in, este método no comprueba la propiedad especificada en la cadena de prototipos del objeto. (fuente: MDN )
Tiene tres objetos y los métodos que está utilizando para probar están destinados a un solo objeto.
obj - objeto que contiene una propiedad de juegosobj.games - matriz con un elementoobj.games[0] - objeto con propiedad idConsidere estos que son todos verdaderos:
let obj = { games: [ {id: 'test'} ] } console.log(`obj.hasOwnProperty('games')`, obj.hasOwnProperty('games')) console.log(`'games' in obj`, 'games' in obj) console.log(`obj.games.hasOwnProperty('0')`, obj.games.hasOwnProperty('0')) console.log(`'0' in obj.games`, '0' in obj.games) console.log(`obj.games[0].hasOwnProperty('id')`, obj.games[0].hasOwnProperty('id')) console.log(`'id' in obj.games[0]`, 'id' in obj.games[0]) if (obj && obj.games && obj.games.length > 0 && obj.games[0].id) { console.log('obj.games has at least one element, ' + 'and the first element has an id') } let id = obj && obj.games && obj.games.length > 0 && obj.games[0].id; console.log('id:', id);