Verificar a presença de uma chave no objeto JavaScript?

Como verificar se existe uma chave específica em um objeto ou matriz de JavaScript?

Se a chave não existir e eu tentar acessá-la, ela retornará false? Ou jogue um erro?

2418
08 июля '09 в 16:21 2009-07-08 16:21 Adam Ernst está definido 08 de julho de 2009 às 16:21 2009-07-08 16:21
@ 20 respostas

Uma verificação de incerteza não é uma maneira precisa de verificar uma chave. E se a chave existir, mas o valor é realmente undefined ?

 var obj = { key: undefined }; obj["key"] != undefined // false, but the key exists! 

Em vez disso, você deve usar o operador in :

 "key" in obj // true, regardless of the actual value 

Se você quiser verificar se existe uma chave, não se esqueça de usar colchetes:

 !("key" in obj) // true if "key" doesn't exist in object !"key" in obj // ERROR! Equivalent to "false in obj" 

Ou, se você quiser verificar especialmente as propriedades de uma instância de objeto (e não propriedades herdadas), use hasOwnProperty :

 obj.hasOwnProperty("key") // true 

Para comparações de desempenho entre os métodos que estão in , hasOwnProperty e a chave não são undefined , consulte.

3343
08 июля '09 в 18:51 2009-07-08 18:51 a resposta é dada por Ates Goral Ates Goral 08 de julho de 2009 às 18:51 2009-07-08 18:51

resposta rápida

Como verificar se existe alguma chave específica no objeto ou matriz de JavaScript? Se a chave não existir e eu tentar acessá-la, ela retornará false? Ou jogue um erro?

Acessar a propriedade ausente diretamente usando o estilo de matriz (associativo) ou o estilo de objeto retorna uma constante indefinida.

Método do operador lento e confiável e hasOwnProperty

Como mencionado aqui, você pode ter um objeto com uma propriedade associada à constante "indefinida".

  var bizzareObj = {valid_key: undefined}; 

Nesse caso, você precisará usar hasOwnProperty ou o operador para descobrir se a chave realmente é. Mas, mas a que preço?

então eu te digo

em operator e hasOwnProperty são “métodos” que usam o mecanismo de descritor de propriedade de Javascript (semelhante ao Java em Java).

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

O tipo de descritor de propriedade é usado para explicar as manipulações e redefinir os atributos da propriedade nomeada. Os valores de tipo de descritor de propriedade são registros que consistem em campos nomeados, em que cada nome de campo é um nome de atributo e seu valor é o valor de atributo correspondente, conforme especificado em 8.6.1. Além disso, qualquer campo pode estar presente ou ausente.

Por outro lado, chamar o método de um objeto ou chave usará o mecanismo Javascript [[Get]]. É muito mais rápido!

teste de referência

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

2019

240
27 февр. a resposta é dada por rdllopes em 27 de fevereiro 2014-02-27 19:38 '14 às 19:38 2014-02-27 19:38

Ele retornará undefined .

 var aa = {hello: "world"}; alert( aa["hello"] ); // popup box with "world" alert( aa["goodbye"] ); // popup box with "undefined" 

undefined é um valor constante especial. Então você pode dizer, por exemplo,

 // note the three equal signs so that null won't be equal to undefined if( aa["goodbye"] === undefined ) { // do something } 

Esta é provavelmente a melhor maneira de verificar a falta de chaves. Entretanto, conforme declarado no comentário abaixo, é teoricamente possível que você queira que o valor real seja undefined . Eu nunca tive que fazer isso, e eu não posso pensar sobre o motivo pelo qual eu sempre quis, mas apenas por uma questão de completude, você pode usar o operador in

 // this works even if you have {"goodbye": undefined} if( "goodbye" in aa ) { // do something } 
118
08 июля '09 в 16:24 2009-07-08 16:24 a resposta é dada por Eli Courtwright July 08 '09 at 16:24 2009-07-08 16:24

A resposta aceita se refere ao objeto . Cuidado ao usar o operador in uma matriz para procurar dados em vez de chaves:

 ("true" in ["true", "false"]) // -> false (Because the keys of the above Array are actually 0 and 1) 

Verificar elementos existentes em uma matriz: a melhor maneira de encontrar um elemento em uma matriz JavaScript?

24
01 июля '15 в 15:45 2015-07-01 15:45 a resposta é dada lidar 01 de julho de 2015 às 15:45 2015-07-01 15:45
 "key" in obj 

Provavelmente, testar apenas os valores de atributos de objeto que são muito diferentes das chaves da matriz.

20
25 апр. a resposta é dada por user2320522 25 apr. 2013-04-25 18:45 '13 às 6:45 pm 2013-04-25 18:45

Três maneiras de verificar se uma propriedade está presente em um objeto javascript:

  • !! obj.theProperty
    Converte um valor para bool. retorna TRUE para todos, exceto o valor "false"
  • 'theProperty' em obj
    Retorna true se a propriedade existir, independentemente do seu valor (mesmo vazio)
  • obj.hasOwnProperty ('theProperty')
    Não verifica a cadeia de protótipos. (como todos os objetos possuem um método toString, 1 e 2 retornam true e 3 podem retornar false).

Referência:

http://book.mixu.net/node/ch5.html

20
12 нояб. Resposta é dada por Lavi Avigdor 12 de novembro 2013-11-12 12:19 '13 às 12:19 2013-11-12 12:19

Se você usar a biblioteca underscore.js , as operações com um objeto / array se tornarão simples.

No seu caso, o método _.has pode ser usado. Exemplo:

 yourArray = {age: "10"} _.has(yourArray, "age") 

retorna verdadeiro

Mas

 _.has(yourArray, "invalidKey") 

retorna falso

13
29 мая '14 в 22:37 2014-05-29 22:37 a resposta é dada vatsal 29 de maio de '14 at 22:37 2014-05-29 22:37

Resposta:

 if ("key" in myObj) { console.log("key exists!"); } else { console.log("key doesn't exist!"); } 

Explicação:

O operador in verifica a presença de uma chave no objeto. Se você notou que o valor é indefinido: if (myObj["key"] === 'undefined') , você pode encontrar problemas, porque pode haver uma chave com undefined em seu objeto.

Por esse motivo, é muito melhor usar primeiro o operador in e comparar o valor dentro da chave assim que você já souber que ela existe.

12
22 июня '16 в 5:29 2016-06-22 05:29 a resposta é dada por Webeng em 22 de junho '16 em 5:29 2016-06-22 05:29

Aqui está uma função auxiliar, que eu acho muito útil.

Este keyExists(key, search) pode ser usado para procurar facilmente por uma chave dentro de objetos ou matrizes!

Apenas dê a ele a chave que você quer encontrar e procure por obj (objeto ou array) que você quer encontrar.

 function keyExists(key, search) { if (!search || (search.constructor !== Array  search.constructor !== Object)) { return false; } for (var i = 0; i < search.length; i++) { if (search[i] === key) { return true; } } return key in search; } 

Como usá-lo:

Pesquisar chaves em matrizes

 keyExists('apple', ['apple', 'banana', 'orange']); // true keyExists('fruit', ['apple', 'banana', 'orange']); // false 

Procurar por chaves em objetos

 keyExists('age', {'name': 'Bill', 'age': 29 }); // true keyExists('title', {'name': 'Jason', 'age': 29 }); // false 

Foi bastante confiável e funciona bem no cross-browser.

9
05 марта '16 в 15:56 2016-03-05 15:56 A resposta é dada por jaredwilli março 05 '16 em 15:56 2016-03-05 15:56

Solução ES6

usando Array#some e Object.keys . Ele retorna true se a chave especificada existir no objeto ou false se não existir.

 console.log(Object.keys({foo: 'one', bar: 'two'}).some(v => v == 'foo')); 
5
26 марта '17 в 18:45 2017-03-26 18:45 a resposta é dada amável usuário 26 de março de '17 às 18:45 2017-03-26 18:45

vanila js

 yourObjName.hasOwnProperty(key) : true ? false; 

Se você quiser verificar se um objeto tem pelo menos uma propriedade em es2015

 Object.keys(yourObjName).length : true ? false 
5
25 янв. A resposta é dada por Hajji Tarik 25 de janeiro 2017-01-25 18:39 '17 às 6:39 2017-01-25 18:39

Podemos usar - hasOwnProperty.call(obj, key);

underscore.js -

 if(_.has(this.options, 'login')){ //key 'login' exists in this.options } _.has = function(obj, key) { return hasOwnProperty.call(obj, key); }; 
3
02 дек. Resposta dada por Mohan Dere 02 dez 2016-12-02 18:38 '16 às 18:38 2016-12-02 18:38

Essa é uma pergunta antiga, mas acho que nunca é tarde para responder.

Imagine que você tenha um objeto "bens" e dois elementos. Se você quiser ver se um identificador já existe neste objeto, você pode usar find ()

 products = [ { "id": 1, "name": "Name 1" }, { "id": 2, "name": "Name 2" }, ] item1 = { "id": 3, "name": "Name 3", } item2 = { "id": 1, "name": "Name 1", } if(products.find(x => x.id === item1.id)){ console.log('id is in products'); }else { console.log('id is not in products'); } if(products.find(x => x.id === item2.id)){ console.log('id is in products'); }else { console.log('id is not in products'); } 

Jornal:

 id is not in products id is in products 
2
26 окт. a resposta é dada Admir 26 out. 2017-10-26 16:31 '17 às 16:31 , 2017-10-26 16:31

A maneira mais fácil de verificar isso

 "key" in object 

por exemplo:

 var obj = { a: 1, b: 2, } "a" in obj // true "c" in obj // false 

Retornar um valor como true implica que a chave existe no objeto.

2
05 нояб. a resposta é dada shekhardtu 05 nov. 2018-11-05 18:30 18 às 18 : 30h de 2018-11-05 às 18: 30h

Embora verifique necessariamente se existe uma chave, ela verifica a plausibilidade de um valor. Quais undefined e null se enquadram.

Boolean(obj.foo)

Esta solução funciona melhor para mim porque eu uso datilografia e uso de strings como 'foo' in obj ou obj.hasOwnProperty('foo') para verificar se a chave existe ou não, não me fornece intellisense.

1
03 янв. a resposta é dada por Abdel 03 jan. 2018-01-03 19:05 '18 às 19:05 2018-01-03 19:05

Para aqueles que têm lodash incluído em seu projeto:
Existe um lodash _. obtenha um método que tente obter chaves profundas:

Retorna o valor do caminho do objeto. Se o valor permitido for indefinido, o defaultValue retornará ao seu lugar.

 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

Ele verificará efetivamente se essa chave está instalada, mesmo que seja profunda , e não causará um erro que possa prejudicar o fluxo do programa se essa chave não estiver definida.

1
29 марта '17 в 17:47 2017-03-29 17:47 a resposta é dada por vsync em 29 de março '17 às 17:47 2017-03-29 17:47

Este exemplo pode demonstrar as diferenças entre as várias maneiras. Espero que isso ajude você a escolher a opção certa para suas necessidades:

 // Lets create object 'a' using create function 'A' function A(){}; A.prototype.onProtDef=2; A.prototype.onProtUndef=undefined; var a=new A(); a.ownProp = 3; a.ownPropUndef = undefined; // Let try different methods: a.onProtDef; // 2 a.onProtUndef; // undefined a.ownProp; // 3 a.ownPropUndef; // undefined a.whatEver; // undefined a.valueOf; // ƒ valueOf() { [native code] } a.hasOwnProperty('onProtDef'); // false a.hasOwnProperty('onProtUndef'); // false a.hasOwnProperty('ownProp'); // true a.hasOwnProperty('ownPropUndef'); // true a.hasOwnProperty('whatEver'); // false a.hasOwnProperty('valueOf'); // false 'onProtDef' in a; // true 'onProtUndef' in a; // true 'ownProp' in a; // true 'ownPropUndef' in a; // true 'whatEver' in a; // false 'valueOf' in a; // true (on the prototype chain - Object.valueOf) Object.keys(a); // ["ownProp", "ownPropUndef"] 
1
21 февр. a resposta é dada Alexander 21 de fevereiro 2018-02-21 17:23 '18 em 5:23 PM 2018-02-21 17:23

yourArray.indexOf (yourArrayKeyName)> -1

 fruit = ['apple', 'grapes', 'banana'] fruit.indexOf('apple') > -1 

a verdade


 fruit = ['apple', 'grapes', 'banana'] fruit.indexOf('apple1') > -1 

falso

0
19 февр. a resposta é dada por Anupam Maurya em 19 de fevereiro. 2019-02-19 13:59 19 às 13:59 2019-02-19 13:59

Se você quiser verificar qualquer tecla em qualquer profundidade do objeto e levar os valores de Falsey em consideração, considere esta linha para a função de serviço:

 var keyExistsOn = (o, k) => k.split(".").reduce((a, c) => a.hasOwnProperty(c) ? a[c] || 1 : false, Object.assign({}, o)) === false ? false : true; 

Resultados

 var obj = { test: "", locals: { test: "", test2: false, test3: NaN, test4: 0, test5: undefined, auth: { user: "hw" } } } keyExistsOn(obj, "") > false keyExistsOn(obj, "locals.test") > true keyExistsOn(obj, "locals.test2") > true keyExistsOn(obj, "locals.test3") > true keyExistsOn(obj, "locals.test4") > true keyExistsOn(obj, "locals.test5") > true keyExistsOn(obj, "sdsdf") false keyExistsOn(obj, "sdsdf.rtsd") false keyExistsOn(obj, "sdsdf.234d") false keyExistsOn(obj, "2134.sdsdf.234d") false keyExistsOn(obj, "locals") true keyExistsOn(obj, "locals.") false keyExistsOn(obj, "locals.auth") true keyExistsOn(obj, "locals.autht") false keyExistsOn(obj, "locals.auth.") false keyExistsOn(obj, "locals.auth.user") true keyExistsOn(obj, "locals.auth.userr") false keyExistsOn(obj, "locals.auth.user.") false keyExistsOn(obj, "locals.auth.user") true 

Confira também este pacote NPM: https://www.npmjs.com/package/has-deep-value

0
07 сент. a resposta é dada Alex 07 set. 2018-09-07 13:04 '18 às 1:04 pm 2018-09-07 13:04

Nova solução incrível com JavaScript Destructuring :

 let obj = { "key1": "value1", "key2": "value2", "key3": "value3", }; let {key1, key2, key3, key4} = obj; // key1 = "value1" // key2 = "value2" // key3 = "value3" // key4 = undefined // Can easily use 'if' here on key4 if(!key4) { console.log("key not present"); } // Key not present 

Verifique outros usos para Destructuring JavaScript

0
31 авг. a resposta é dada NAVIN 31 ago. 2018-08-31 21:05 '18 às 21:05 2018-08-31 21:05

Outras questões sobre tags ou Faça uma pergunta