Após uma solicitação AJAX, às vezes meu aplicativo pode retornar um objeto vazio, como:
var a = {};
Como posso verificar se é esse o caso?
Após uma solicitação AJAX, às vezes meu aplicativo pode retornar um objeto vazio, como:
var a = {};
Como posso verificar se é esse o caso?
if( Object.entries(a).length > 0){ //do }
Respostas:
ECMA 5+ :
Observe, no entanto, que isso cria uma matriz desnecessária (o valor de retorno de
keys
).Pré-ECMA 5:
jQuery :
lodash :
Sublinhado :
Hoek
ExtJS
AngularJS (versão 1)
Ramda
fonte
Object.keys(new Date()).length === 0
; então essa resposta pode ser enganosa.(new Date()).constructor === Date
ou vice-versa({}).constructor === Object
.Object.keys()
não verifica propriedades não enumeráveis ou símbolos. Você precisa usarObject.getOwnPropertyNames()
e emObject.getOwnPropertySymbols()
vez disso. Além disso,Object.getPrototypeOf()
é a maneira correta de obter o protótipo de um objeto.obj.constructor
pode ser facilmente forjado. Exemplo:function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.Não há maneira fácil de fazer isso. Você terá que fazer um loop sobre as propriedades explicitamente:
Se o suporte ao ECMAScript 5 estiver disponível, você poderá usar
Object.keys()
:fonte
isEmpty()
, então ele deve retornarfalse
se ele tem uma propriedadePara aqueles que têm o mesmo problema, mas usam o jQuery, você pode usar o jQuery.isEmptyObject .
fonte
underscore.js
...Esta é a minha solução preferida:
fonte
Object.keys(new Date()).length === 0
; então essa resposta pode ser enganosa.new Date()
não é um objeto.nd = new Date(); nd.constructor === Object;
resulta emfalse
.Você pode usar o Underscore.js .
fonte
consulte http://bencollier.net/2011/04/javascript-is-an-object-empty/
fonte
Object.getOwnPropertyNames(new Date()).length === 0
; então essa resposta pode ser enganosa.Que tal usar JSON.stringify? Está quase disponível em todos os navegadores modernos.
fonte
Acabei de encontrar uma situação semelhante. Eu não queria usar JQuery e queria fazer isso usando Javascript puro.
E o que fiz foi usar a seguinte condição e funcionou para mim.
Para não igual a, use o seguinte:
JSON.stringify(obj) !== '{}'
Confira este JSFiddle
fonte
Pergunta antiga, mas só tinha o problema. Incluir JQuery não é realmente uma boa idéia se seu único objetivo é verificar se o objeto não está vazio. Em vez disso, entre no código do JQuery e você obterá a resposta:
fonte
Existe uma maneira simples se você estiver em um navegador mais recente.
Object.keys(obj).length == 0
fonte
keys
propriedade?Object.keys
é um método padrão, mas os objetos não possuem uma propriedade de chaves. Portanto, esse código reportará qualquer objeto como vazio, exceto que acidentalmente possui uma propriedade nomeadakey
com um valor que novamente como uma propriedade nomeadalength
que não é zero. Horrível!Object.keys(new Date()).length === 0
; então essa resposta pode ser enganosa.atuação
Hoje 2020.01.17 realizo testes no MacOs HighSierra 10.13.6 no Chrome v79.0, Safari v13.0.4 e Firefox v72.0, para soluções escolhidas.
Conclusões
for-in
(A, J, L, M) são mais rápidasJSON.stringify
(B, K) são lentasObject
(N) é lentaDetalhes
Abaixo no snippet são apresentadas 15 soluções. Se você deseja executar o teste de desempenho em sua máquina, clique AQUI .
Mostrar snippet de código
fonte
O uso de Object.keys (obj) .length (como sugerido acima para ECMA 5+) é 10 vezes mais lento para objetos vazios! continue com a opção old school (for ... in).
Testado no Node, Chrome, Firefox e IE 9, fica evidente que, na maioria dos casos de uso:
Em termos de desempenho, use:
ou
Veja resultados detalhados e código de teste em O objeto está vazio?
fonte
Object.keys
é lento, mas menos código. Em uma página pequena, onde isso é chamado ... talvez 10 vezes ... Isso ainda será mais lento, considerando o tempo de análise adicional do código adicional?Você pode verificar a contagem das chaves do objeto:
fonte
Apenas uma solução alternativa. Seu servidor pode gerar alguma propriedade especial no caso de não haver dados?
Por exemplo:
Em seguida, você pode verificá-lo facilmente no seu código de retorno de chamada AJAX.
Outra maneira de verificar isso:
EDIT : Se você usar qualquer biblioteca JSON (fe JSON.js), poderá tentar a função JSON.encode () e testar o resultado em relação à cadeia de valor vazia.
fonte
toSource()
é não-padrão e não funciona no IE ou Opera (e potencialmente outros navegadores eu não verificar)toSource
propriedade na seção 15.2.4; de acordo com o MDC, foi introduzido no JS1.3 (ou seja, Netscape Navigator 4.06), mas NÃO está no ECMA-262, 3ª edição!toSource()
é uma maneira horrível de fazer isso (como estáJSON.encode()
). Ele precisa criar uma string que represente todo o objeto para verificar se está vazio. Existe a sobrecarga de converter coisas em seqüências de caracteres, mas além disso, será necessário converter um milhão de coisas se o seu objeto tiver um milhão de propriedades, enquanto apenas a observação de uma delas permitirá que você saiba que ela não está vazia.Eu criei uma função completa para determinar se o objeto está vazio.
Ele usa
Object.keys
da funcionalidade ECMAScript 5 (ES5), se possível, para obter o melhor desempenho (consulte a tabela de compatibilidade ) e fallbacks para a abordagem mais compatível para mecanismos mais antigos (navegadores).Solução
Aqui está a essência deste código.
E aqui está o JSFiddle com demonstração e um teste simples.
Espero que ajude alguém. Felicidades!
fonte
null
objeto.Object.keys(new Date()).length === 0
; então essa resposta pode ser enganosa.Eu estou usando isso.
Por exemplo:
daqui
Atualizar
OU
você pode usar a implementação jQuery de isEmptyObject
fonte
O exemplo a seguir mostra como testar se um objeto JavaScript está vazio, se por vazio significa que não temos propriedades próprias.
O script funciona no ES6.
fonte
fonte
Object.keys
ouObject.values
?fonte
Object
com um método através da cadeia de protótipos, porque isso é enumerável e afor in
instrução faz um loop através de propriedades enumeráveis.O jQuery possui uma função especial
isEmptyObject()
para este caso:Leia mais em http://api.jquery.com/jQuery.isEmptyObject/
fonte
Gostaria de verificar se tem pelo menos uma chave. Seria o suficiente para me dizer que não está vazio.
fonte
false
valor? o resultado seráfalse
incorreto.Sob o capô, todos os métodos de verificação vazia em todas as bibliotecas usam a lógica de verificação de chaves de objetos. É uma maneira estranha de torná-lo compreensível, que você pode colocar em um método, descrito aqui .
Que evoluiu no ES5 , agora você pode simplesmente verificar o comprimento das chaves do objeto, usando o
Object.Keys
método que leva seu objeto como parâmetro:Ou se você estiver usando o Lodash (você deve estar) então.
fonte
você pode usar esse código simples que não usou jQuery ou outras bibliotecas
A classe JSON e suas funções ( análise e stringify ) são muito úteis, mas tem alguns problemas com o IE7 que podem ser corrigidos com este código simples http://www.json.org/js.html .
Outra maneira simples (maneira mais simples):
você pode usar dessa maneira sem usar o objeto jQuery ou JSON .
fonte
JSON.stringify
A solução falhará se o objeto contiver propriedades não stringificáveis, como funções ou "indefinido", embora seja um caso extremo.Melhor maneira que eu encontrei:
Trabalha para:
fonte
if (!obj && obj !== 0)
.Minha vez:
Acho que nem todos os navegadores implementam
Object.keys()
atualmente.fonte
Object.keys(new Date()).length === 0
; então essa resposta pode ser enganosa.Se o jQuery e o navegador da web não estiverem disponíveis, também haverá uma função isEmpty no underscore.js.
Além disso, ele não assume que o parâmetro de entrada seja um objeto. Para uma lista ou sequência ou indefinida, ela também girará a resposta correta.
fonte
Embargo! Cuidado com as limitações do JSON.
exibe
fonte
A resposta correta é:
Isso verifica se:
Object.prototype
.Em outras palavras, o objeto é indistinguível de um criado com
{}
.fonte
Além da resposta de Thevs:
é jquery + jquery.json
fonte
$.isEmptyObject()
, não perca ciclos com conversões não óbvias.O Sugar.JS fornece objetos estendidos para esse fim. O código é limpo e simples:
Faça um objeto estendido:
Verifique o tamanho:
fonte