Después de una solicitud AJAX, a veces mi aplicación puede devolver un objeto vacío, como:
var a = {};
¿Cómo puedo verificar si ese es el caso?
if( Object.entries(a).length > 0){ //do }
Después de una solicitud AJAX, a veces mi aplicación puede devolver un objeto vacío, como:
var a = {};
¿Cómo puedo verificar si ese es el caso?
if( Object.entries(a).length > 0){ //do }
Respuestas:
ECMA 5+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
Sin embargo, tenga en cuenta que esto crea una matriz innecesaria (el valor de retorno de keys
).
Pre-ECMA 5:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery :
jQuery.isEmptyObject({}); // true
lodash :
_.isEmpty({}); // true
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
Object.keys(new Date()).length === 0
; entonces esta respuesta puede ser engañosa.
(new Date()).constructor === Date
o viceversa ({}).constructor === Object
.
Object.keys()
no verifica propiedades o símbolos no enumerables. Necesitas usar Object.getOwnPropertyNames()
y en su Object.getOwnPropertySymbols()
lugar. Además, Object.getPrototypeOf()
es la forma correcta de obtener el prototipo de un objeto. obj.constructor
Se puede forjar fácilmente. Ejemplo: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.
No hay una manera fácil de hacer esto. Tendrá que recorrer las propiedades explícitamente:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
Si el soporte ECMAScript 5 está disponible, puede usar Object.keys()
en su lugar:
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
isEmpty()
, por lo que debería regresar false
si tiene una propiedad
Para aquellos de ustedes que tienen el mismo problema pero usan jQuery, pueden usar jQuery.isEmptyObject .
underscore.js
...
Esta es mi solución preferida:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Object.keys(new Date()).length === 0
; entonces esta respuesta puede ser engañosa.
new Date()
No es un objeto. nd = new Date(); nd.constructor === Object;
resultados en false
.
Puedes usar Underscore.js .
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
ver http://bencollier.net/2011/04/javascript-is-an-object-empty/
Object.getOwnPropertyNames(new Date()).length === 0
; entonces esta respuesta puede ser engañosa.
¿Qué tal usar JSON.stringify? Está casi disponible en todos los navegadores modernos.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
Me encontré con una situación similar. No quería usar JQuery, y quería hacerlo usando Javascript puro.
Y lo que hice fue usar la siguiente condición y funcionó para mí.
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
Para no igual a, use esto: JSON.stringify(obj) !== '{}'
Mira este JSFiddle
Antigua pregunta, pero acaba de tener el problema. Incluir JQuery no es realmente una buena idea si su único propósito es verificar si el objeto no está vacío. En cambio, solo profundice en el código de JQuery , y obtendrá la respuesta:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
Hay una manera simple si estás en un navegador más nuevo.
Object.keys(obj).length == 0
Object.keys
es un método estándar pero los objetos no tienen una propiedad de claves. Por lo tanto, este código informará que cualquier objeto está vacío, excepto que accidentalmente tiene una propiedad nombrada key
con un valor que nuevamente como una propiedad nombrada length
que no es cero. ¡Horrible!
Object.keys(new Date()).length === 0
; entonces esta respuesta puede ser engañosa.
Hoy 2020.01.17 realizo pruebas en MacOs HighSierra 10.13.6 en Chrome v79.0, Safari v13.0.4 y Firefox v72.0, para las soluciones elegidas.
Conclusiones
for-in
(A, J, L, M) son más rápidasJSON.stringify
(B, K) son lentasObject
(N) es lentaA continuación en el fragmento se presentan 15 soluciones. Si desea ejecutar una prueba de rendimiento en su máquina, haga clic AQUÍ .
¡Usar Object.keys (obj) .length (como se sugirió anteriormente para ECMA 5+) es 10 veces más lento para objetos vacíos! mantener con la vieja escuela (para ... en) opción.
Probado en Node, Chrome, Firefox e IE 9, se hace evidente que para la mayoría de los casos de uso:
En términos de rendimiento, use:
function isEmpty(obj) {
for (var x in obj) { return false; }
return true;
}
o
function isEmpty(obj) {
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }
return true;
}
Vea los resultados detallados de las pruebas y el código de prueba en ¿Está el objeto vacío?
Object.keys
es lento, pero menos código En una página pequeña, donde esto se llama ... tal vez 10 veces ... ¿Será esto aún más lento teniendo en cuenta el tiempo de análisis adicional del código adicional?
Puede verificar el recuento de las teclas de objeto:
if (Object.keys(a).length > 0) {
// not empty
}
Solo una solución alternativa. ¿Puede su servidor generar alguna propiedad especial en caso de que no haya datos?
Por ejemplo:
var a = {empty:true};
Luego puede verificarlo fácilmente en su código de devolución de llamada AJAX.
Otra forma de verificarlo:
if (a.toSource() === "({})") // then 'a' is empty
EDITAR : si usa cualquier biblioteca JSON (fe JSON.js), entonces puede probar la función JSON.encode () y probar el resultado con una cadena de valor vacía.
toSource()
no es estándar y no funciona en IE u Opera (y potencialmente otros navegadores no me registro)
toSource
propiedad en la sección 15.2.4; según MDC, se introdujo en JS1.3 (es decir, Netscape Navigator 4.06), ¡pero NO está en ECMA-262, tercera edición!
toSource()
es una forma horrible de hacer esto (como está JSON.encode()
). Necesita construir una cadena que represente todo su objeto para verificar si está vacía. Existe la sobrecarga de convertir cosas en cadenas, pero además necesitará convertir un millón de cosas si su objeto tiene un millón de propiedades, mientras que solo mirar una le hará saber que no está vacío.
He creado una función completa para determinar si el objeto está vacío.
Utiliza Object.keys
de ECMAScript 5 (ES5) funcionalidad si es posible para lograr el mejor rendimiento (ver tabla de compatibilidad ) y retrocesos con el enfoque más compatible para los motores más antiguos (navegadores).
/**
* Returns true if specified object has no properties,
* false otherwise.
*
* @param {object} object
* @returns {boolean}
*/
function isObjectEmpty(object)
{
if ('object' !== typeof object) {
throw new Error('Object must be specified.');
}
if (null === object) {
return true;
}
if ('undefined' !== Object.keys) {
// Using ECMAScript 5 feature.
return (0 === Object.keys(object).length);
} else {
// Using legacy compatibility mode.
for (var key in object) {
if (object.hasOwnProperty(key)) {
return false;
}
}
return true;
}
}
Aquí está la esencia de este código.
Y aquí está el JSFiddle con demostración y una prueba simple.
Espero que ayude a alguien. ¡Salud!
Object.keys(new Date()).length === 0
; entonces esta respuesta puede ser engañosa.
Estoy usando esto
function isObjectEmpty(object) {
var isEmpty = true;
for (keys in object) {
isEmpty = false;
break; // exiting since we found that the object is not empty
}
return isEmpty;
}
P.ej:
var myObject = {}; // Object is empty
var isEmpty = isObjectEmpty(myObject); // will return true;
// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"};
// check if the object is empty
isEmpty = isObjectEmpty(myObject); // will return false;
Actualizar
O
puede usar la implementación jQuery de isEmptyObject
function isEmptyObject(obj) {
var name;
for (name in obj) {
return false;
}
return true;
}
El siguiente ejemplo muestra cómo probar si un objeto JavaScript está vacío, si por vacío queremos decir que no tiene propiedades propias.
El script funciona en ES6.
const isEmpty = (obj) => {
if (obj === null ||
obj === undefined ||
Array.isArray(obj) ||
typeof obj !== 'object'
) {
return true;
}
return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty('')); // true
console.log(isEmpty(33)); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello')); // true
console.log(isEmpty([1, 2, 3])); // true
console.log(isEmpty({ test: 1 })); // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date())); // true
console.log(isEmpty(Infinity)); // true
console.log(isEmpty(null)); // true
console.log(isEmpty(undefined)); // true
Según la especificación ES2017 en Object.entries () , la verificación es simple usando cualquier navegador moderno:
Object.entries({}).length === 0
Object.keys
o Object.values
?
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Object
con un método a través de la cadena de prototipos, porque eso es enumerable y la for in
declaración recorre las propiedades enumerables.
jQuery tiene una función especial isEmptyObject()
para este caso:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
Lea más en http://api.jquery.com/jQuery.isEmptyObject/
Me gustaría comprobar si tiene al menos una clave. Eso sería suficiente para decirme que no está vacío.
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
valor? El resultado será false
incorrecto.
Debajo del capó, todos los métodos de verificación vacíos en todas las bibliotecas usan claves de objeto para verificar la lógica. Es una forma extraña de hacer que sea comprensible, lo que puede poner en un método, descrito aquí .
for(key in obj){
//your work here.
break;
}
Que ha evolucionado en ES5 , ahora simplemente puede verificar la longitud de las claves del objeto, utilizando el Object.Keys
método que toma su objeto como parámetro:
if(Object.keys(obj).length > 0){
//do your work here
}
O si está utilizando Lodash (debe ser) entonces.
_.isEmpty(obj) //==true or false
puede usar este código simple que no usó jQuery u otras bibliotecas
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
La clase JSON y sus funciones ( analizar y stringify ) son muy útiles, pero tiene algunos problemas con IE7 que puede solucionar con este código simple http://www.json.org/js.html .
Otra forma simple (forma más simple):
puede usar esta forma sin usar jQuery o el objeto JSON .
var a=({});
function isEmptyObject(obj) {
if(typeof obj!='object') {
//it is not object, so is not empty
return false;
} else {
var x,i=0;
for(x in obj) {
i++;
}
if(i>0) {
//this object has some properties or methods
return false;
} else {
//this object has not any property or method
return true;
}
}
}
alert(isEmptyObject(a)); //true is alerted
La mejor manera que encontré:
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
Trabaja para:
t1: {} -> true
t2: {0:1} -: false
t3: [] -> true
t4: [2] -> false
t5: null -> true
t6: undefined -> true
t7: "" -> true
t8: "a" -> false
t9: 0 -> true
t10: 1 -> false
if (!obj && obj !== 0)
.
Mi toma:
function isEmpty(obj) {
return !Object.keys(obj).length > 0;
}
var a = {a:1, b:2}
var b = {}
console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true
Simplemente, no creo que todos los navegadores se implementen Object.keys()
actualmente.
Object.keys(new Date()).length === 0
; entonces esta respuesta puede ser engañosa.
Si jQuery y el navegador web no están disponibles, también hay una función isEmpty en underscore.js.
_.isEmpty({}) // returns true
Además, no supone que el parámetro de entrada sea un objeto. Para una lista o cadena o indefinida, también dará la respuesta correcta.
¡Consideración! Cuidado con las limitaciones de JSON.
javascript:
obj={ f:function(){} };
alert( "Beware!! obj is NOT empty!\n\nobj = { f:function(){} }" +
"\n\nJSON.stringify( obj )\n\nreturns\n\n" +
JSON.stringify( obj ) );
muestra
¡¡Tener cuidado!! ¡obj NO está vacío! obj = {f: función () {}} JSON.stringify (obj) devoluciones {}
La respuesta correcta es:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
Esto verifica que:
Object.prototype
.En otras palabras, el objeto es indistinguible de uno creado con {}
.
Además de la respuesta de Thevs:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
es jquery + jquery.json
$.isEmptyObject()
, no desperdicie ciclos con conversiones no obvias.
Sugar.JS proporciona objetos extendidos para este propósito. El código es limpio y simple:
Hacer un objeto extendido:
a = Object.extended({})
Comprueba su tamaño:
a.size()