Como verifico se existe uma chave específica em um objeto ou matriz JavaScript?
Se uma chave não existir e eu tentar acessá-la, ela retornará falsa? Ou lançar um erro?
javascript
arrays
object
Adam Ernst
fonte
fonte
property.key = property.key || 'some default value'
, no caso de eu querer que a chave existir com algum valor a elaRespostas:
A verificação de indefinições não é uma maneira precisa de testar se existe uma chave. E se a chave existir, mas o valor for realmente
undefined
?Você deve usar o
in
operador:Se você deseja verificar se uma chave não existe, lembre-se de usar parênteses:
Ou, se você deseja testar particularmente as propriedades da instância do objeto (e não as propriedades herdadas), use
hasOwnProperty
:Para uma comparação de desempenho entre os métodos que são
in
,hasOwnProperty
e o principalundefined
, consulte esta referênciafonte
resposta rápida
Acessar diretamente uma propriedade ausente usando o estilo de matriz (associativo) ou o estilo de objeto retornará uma constante indefinida .
O lento e confiável no operador e no método hasOwnProperty
Como as pessoas já mencionaram aqui, você pode ter um objeto com uma propriedade associada a uma constante "indefinida".
Nesse caso, você terá que usar o hasOwnProperty ou no operador para saber se a chave está realmente lá. Mas, mas a que preço?
então eu te digo ...
no operador e hasOwnProperty são "métodos" que usam o mecanismo do Descritor de propriedades em Javascript (semelhante ao reflexo de Java na linguagem Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Por outro lado, chamar um método ou chave de objeto usará o mecanismo Javascript [[Get]]. Isso é muito mais rápido!
referência
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Usando no operadorO resultado foi
Usando hasOwnPropertyO resultado foi
Acessando elementos diretamente (estilo colchetes)O resultado foi
Acessando elementos diretamente (estilo de objeto)O resultado foi
EDIT: Qual é o motivo para atribuir a uma propriedade o
undefined
valor?Essa pergunta me intriga. Em Javascript, há pelo menos duas referências para objetos ausentes para evitar problemas como este:
null
eundefined
.null
é o valor primitivo que representa a ausência intencional de qualquer valor do objeto ou, em termos curtos, a falta de valor confirmada . Por outro lado,undefined
é um valor desconhecido (não definido). Se houver uma propriedade que será usada posteriormente com um valor adequado, considere usarnull
referência em vez de,undefined
porque no momento inicial, confirma-se que a propriedade não possui valor.Comparar:
Aconselhar
Evite objetos com
undefined
valores. Verifique diretamente sempre que possível e usenull
para inicializar os valores da propriedade. Caso contrário, use oin
operador ouhasOwnProperty()
método lento .EDIT: 12/04/2018 - NÃO É MAIS RELEVANTE
Como as pessoas comentaram, as versões modernas dos mecanismos Javascript (com exceção do Firefox) mudaram a abordagem para as propriedades de acesso. A implementação atual é mais lenta que a anterior para este caso específico, mas a diferença entre a chave de acesso e o objeto é negligenciável.
fonte
delete hash[key]
é muito mais lenta que issohash[key] = undefined
. É claro que, neste caso, não faz sentido para mim precisar doin
operador, mas atua como um contra-exemplo de "devemos sempre evitar definir valor como indefinido".Voltará
undefined
.undefined
é um valor constante especial. Então você pode dizer, por exemploEsta é provavelmente a melhor maneira de verificar se há chaves ausentes. No entanto, como é indicado em um comentário abaixo, é teoricamente possível que você queira que o valor real seja
undefined
. Eu nunca precisei fazer isso e não consigo pensar em uma razão imediata por que eu desejaria, mas apenas por uma questão de perfeição, você pode usar oin
operadorfonte
var undefined = 42;
. Ao testar adereços indefinidos, você deve sempre usar((typeof variable) === "undefined")
.undefined
não é uma propriedade gravável acordo com a especificação ecma-international.org/ecma-262/5.1/#sec-15.1.1.3A resposta aceita refere-se a Objeto . Cuidado ao usar o
in
operador na matriz para encontrar dados em vez de chaves:Para testar elementos existentes em uma matriz: Melhor maneira de descobrir se um item está em uma matriz JavaScript?
fonte
Provavelmente está testando apenas valores de atributos de objetos muito diferentes das chaves da matriz
fonte
Três maneiras de verificar se uma propriedade está presente em um objeto javascript:
!!obj.theProperty
Converterá valor em bool. retorna
true
para todos, exceto ofalse
valortheProperty
' in objRetornará true se a propriedade existir, não importa seu valor (mesmo vazio)
obj.hasOwnProperty('theProperty')
Não verifica a cadeia de protótipos. (como todos os objetos têm o
toString
método, 1 e 2 retornam true nele, enquanto 3 podem retornar false nele).Referência:
fonte
var a = {a : undefined, b : null}; !!a.a **will return false**
!!obj.theProperty
não é uma solução para verificar se um objeto tem uma propriedade chamadatheProperty
. Ele falha para qualquer valor de propriedade falsey,,undefined
null, numérico0
ouNaN
, e a string vazia""
Se você estiver usando a biblioteca underscore.js , as operações de objeto / matriz tornam-se simples.
No seu caso, o método _.has pode ser usado. Exemplo:
retorna verdadeiro
Mas,
retorna falso
fonte
Responda:
Explicação:
O
in
operador verificará se a chave existe no objeto. Se você verificou se o valor era indefinido:,if (myObj["key"] === 'undefined')
você pode ter problemas porque uma chave pode existir no seu objeto com oundefined
valor.Por esse motivo, é uma prática muito melhor usar primeiro o
in
operador e comparar o valor que está dentro da chave depois que você já sabe que ela existe.fonte
Aqui está uma função auxiliar que eu acho bastante útil
Isso
keyExists(key, search)
pode ser usado para pesquisar facilmente uma chave em objetos ou matrizes!Apenas passe a chave que deseja encontrar e pesquise obj (o objeto ou matriz) em que deseja encontrá-la.
Tem sido bastante confiável e funciona bem em vários navegadores.
fonte
Array.indexOf
método interno? (se você está procurando um valor, que é)vanila js
Se você deseja verificar se o objeto tem pelo menos uma propriedade em es2015
fonte
Solução ES6
usando
Array#some
eObject.keys
. Ele retornará true se a chave fornecida existir no objeto ou false se não existir.Exemplo de uma linha.
fonte
Podemos usar -
hasOwnProperty.call(obj, key);
A maneira underscore.js -
fonte
A maneira mais fácil de verificar é
por exemplo:
O valor retornado como true implica que a chave existe no objeto.
fonte
Para aqueles que
lodash
incluíram em seu projeto:Existe um método lodash _.get que tenta obter chaves "profundas":
Isso efetivamente verificará se essa chave, por mais profunda que seja, está definida e não emitirá um erro que poderá prejudicar o fluxo do seu programa se essa chave não estiver definida.
fonte
Embora isso não verifique necessariamente se existe uma chave, verifica a veracidade de um valor. Qual
undefined
enull
cair.Boolean(obj.foo)
Essa solução funciona melhor para mim, porque eu uso o texto datilografado e o uso de seqüências de caracteres como essa
'foo' in obj
ouobj.hasOwnProperty('foo')
para verificar se uma chave existe ou não, não me fornece inteligência.fonte
Se você deseja verificar qualquer chave em qualquer profundidade de um objeto e considerar os valores de falsey, considere esta linha para uma função de utilitário:
Resultados
Consulte também este pacote do NPM: https://www.npmjs.com/package/has-deep-value
fonte
fonte
No mundo 'array', podemos olhar nos índices como algum tipo de chave. O que surpreende o
in
operador (que é uma boa escolha para o objeto) também trabalha com matrizes. O valor retornado para a chave inexistente éundefined
fonte
yourArray.indexOf (yourArrayKeyName)> -1
verdade
falso
fonte
Este exemplo pode demonstrar as diferenças entre maneiras diferentes. Espero que ajude você a escolher o caminho certo para suas necessidades:
fonte
Nova solução impressionante com a destruição do JavaScript :
Verifique outro uso da destruição de JavaScript
fonte