Как проверить пустой объект JavaScript?
после запроса AJAX иногда мое приложение может возвращать пустой объект, например:
var a = {};
Как я могу проверить, так ли это?
30 ответов
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
Pre-ECMA 5:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery.isEmptyObject({}); // true
_.isEmpty({}); // true
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
нет простого способа сделать это. Вам придется явно зацикливаться на свойствах:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
Если поддержка ECMAScript 5 можно использовать Object.keys()
вместо:
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
для тех из вас, кто имеет такую же проблему, но использует jQuery, вы можете использовать С помощью jQuery.isEmptyObject.
Это мое предпочтительное решение:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
см.http://bencollier.net/2011/04/javascript-is-an-object-empty/
Как насчет использования JSON.преобразовать в строки? Это почти во всех современных браузерах.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
старый вопрос, но просто была проблема. Включение JQuery не очень хорошая идея, если ваша единственная цель-проверить, не пуст ли объект. Вместо этого, просто глубоко в код JQuery, и вы получите ответ:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
Я только что столкнулся с подобной ситуацией. Я не хотел использовать JQuery и хотел сделать это с помощью чистого Javascript.
и то, что я сделал, использовало следующее условие, и оно сработало для меня.
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
для не равно, используйте это:JSON.stringify(obj) !== '{}'
зацените JSFiddle
Я создал полную функцию, чтобы определить, пуст ли объект.
Он использует Object.keys
С ECMAScript 5 (ES5) функциональность, если это возможно для достижения наилучшей производительности (см. таблица совместимости) и обратные пути к наиболее совместимому подходу для старых двигателей (браузеров).
решение
/**
* 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;
}
}
здесь суть для этого кода.
и вот JSFiddle с демонстрацией и простой тест.
Я надеюсь, это поможет кому-то. Ура!
-
просто обходной путь. Может ли ваш сервер генерировать какое-то специальное свойство в случае отсутствия данных?
например:
var a = {empty:true};
затем вы можете легко проверить его в своем коде обратного вызова AJAX.
-
другой способ проверить это:
if (a.toSource() === "({})") // then 'a' is empty
редактировать: Если вы используете любую библиотеку JSON (f.e. JSON.js) тогда вы можете попробовать JSON.функция encode () и проверка результата на пустую строку значений.
Использование Объекта.ключи(объект).длина (как предложено выше для ECMA 5+) в 10 раз медленнее для пустых объектов! продолжайте использовать опцию old school (for...in).
протестировано под Node, Chrom, Firefox и IE 9, становится очевидным, что для большинства случаев использования:
- (...в...) самый быстрый вариант использовать!
Я использую это.
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;
}
например:
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;
обновление
или
вы можете использовать реализацию jQuery isEmptyObject
function isEmptyObject ( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
}
jQuery имеют специальную функцию isEmptyObject()
для этого случая:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
подробнее на http://api.jquery.com/jQuery.isEmptyObject/
вы можете использовать этот простой код, не использовать jQuery или других библиотеки
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
JSON класс и его функции (парсить и преобразовать в строки) очень полезны, но имеют некоторые проблемы с IE7 что вы можете исправить это с помощью этого простого кода http://www.json.org/js.html.
другой простой способ (самый простой способ) :
вы можете использовать этот путь без использования jQuery или JSON
лучший способ, который я нашел:
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
работает:
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
в следующем примере показано, как проверить, является ли объект JavaScript пустым, если под пустым мы подразумеваем отсутствие собственных свойств.
скрипт работает на 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
Если jQuery и веб-браузер недоступны, в подчеркивании также есть функция isEmpty.js.
_.isEmpty({}) // returns true
кроме того, он не предполагает, что входной параметр является объектом. Для списка или строки или undefined он также превратит правильный ответ.
мое мнение:
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
просто, я не думаю, что все браузеры реализуют .
в дополнение к Thevs ответ:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
это jquery + jquery.в JSON
нюанс! Остерегайтесь limitiations в 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 ) );
выводит
Beware!! obj is NOT empty! obj = { f:function(){} } JSON.stringify( obj ) returns {}
сахар.JS предоставляет расширенные объекты для этой цели. Код чистый и простой:
сделать расширенный объекта:
a = Object.extended({})
проверьте его размер:
a.size()
Другой альтернативой является использование есть.js (14kB) в отличие от в jQuery (32 КБ), лодашь (50kB), или подчеркивание (16.4 КБ). есть.js оказалась самой быстрой библиотекой среди вышеупомянутых библиотек, которая может использоваться для определения пустоты объекта.
http://jsperf.com/check-empty-object-using-libraries
очевидно, что все эти библиотеки не совсем то же самое, так что если вы нужно легко манипулировать DOM тогда в jQuery все еще может быть хорошим выбором, или если вам нужно больше, чем просто проверка типа потом лодашь или подчеркивание может быть хорошо. Что касается есть.js, вот синтаксис:
var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false
как подчеркивание и лодаш _.isObject()
, это не только для objects
но также относится к arrays
и strings
.
под капотом эта библиотека использует Object.getOwnPropertyNames
что похоже к Object.keys
но Object.getOwnPropertyNames
является более тщательным, так как он вернет перечисляемые и не перечисляемые свойства, как описано здесь.
is.empty = function(value) {
if(is.object(value)){
var num = Object.getOwnPropertyNames(value).length;
if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){
return true;
}
return false;
} else {
return value === '';
}
};
если вы не хотите вводить библиотеку (что понятно), и вы знаете, что вы проверяете только объекты (не массивы или строки), то следующая функция должна соответствовать вашим потребностям.
function isEmptyObject( obj ) {
return Object.getOwnPropertyNames(obj).length === 0;
}
это только немного быстрее, чем есть.js, хотя только потому, что вы не проверяете, является ли это объект.
правильный ответ:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
Это проверяет, что:
- объект имеет собственные свойства (независимо от перечисляемость).
- объект не имеет собственных символов свойств.
- прототип объекта точно
Object.prototype
.
другими словами, объект неотличим от объекта, созданного с помощью {}
.
Я бы пошел проверить, есть ли у него хотя бы один ключ. Этого достаточно, чтобы понять, что она не пуста.
Boolean(Object.keys(obj)[0])