Как проверить наличие пустого объекта JavaScript?

После запроса AJAX иногда мое приложение может возвращать пустой объект, например:

var a = {};

Как я могу проверить, является ли это случай?

2131
задан 25 марта '09 в 4:39
источник поделиться
46 ответов
  • 1
  • 2

ECMA 7+:

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.entries(obj).length === 0 && obj.constructor === Object

ECMA 5+:

// 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:

jQuery.isEmptyObject({}); // true

Лодаш:

_.isEmpty({}); // true

Подчеркнуть:

_.isEmpty({}); // true

Хук

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (версия 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true
3573
ответ дан 20 авг. '15 в 4:32
источник

Там нет простого способа сделать это. Вы должны будете явно перекрыть свойства:

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;
}
772
ответ дан 25 марта '09 в 4:49
источник

Для тех из вас, кто имеет ту же проблему, но использует jQuery, вы можете использовать jQuery.isEmptyObject.

546
ответ дан 19 мая '10 в 17:07
источник

Это мое предпочтительное решение:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
209
ответ дан 12 июля '14 в 10:46
источник

Вы можете использовать Underscore.js.

_.isEmpty({}); // true
191
ответ дан 22 марта '11 в 23:35
источник
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

см. http://bencollier.net/2011/04/javascript-is-an-object-empty/

107
ответ дан 06 нояб. '13 в 16:48
источник

Как насчет использования JSON.stringify? Он доступен почти во всех современных браузерах.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}
65
ответ дан 23 янв. '13 в 23:07
источник

Старый вопрос, но у него была проблема. Включение JQuery на самом деле не является хорошей идеей, если ваша единственная цель - проверить, не объект ли пуст. Вместо этого, просто в код JQuery, и вы получите ответ:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
54
ответ дан 31 янв. '13 в 13:55
источник

Я столкнулся с подобной ситуацией. Я не хотел использовать JQuery и хотел сделать это, используя чистый Javascript.

И что я сделал, использовал следующее условие, и это сработало для меня.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

Для не равных, используйте это: JSON.stringify(obj) !== '{}'

Посмотрите JSFiddle

46
ответ дан 22 сент. '14 в 8:38
источник

Существует простой способ, если вы находитесь в более новом браузере. Object.keys(obj).length == 0

26
ответ дан 29 апр. '12 в 22:25
источник

Я создал полную функцию, чтобы определить, является ли объект пустым.

Он использует функциональные возможности 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 с демонстрацией и простым тестом.

Надеюсь, это кому-нибудь поможет. Ура!

21
ответ дан 21 мая '14 в 16:55
источник

Вы можете проверить количество клавиш Object:

if (Object.keys(a).length > 0) {
    // not empty
}
20
ответ дан 30 июня '17 в 13:11
источник
  • Просто обходной путь. Может ли ваш сервер генерировать какое-то особое свойство в случае отсутствия данных?

    Например:

    var a = {empty:true};
    

    Затем вы можете легко проверить его в коде обратного вызова AJAX.

  • Еще один способ проверить:

    if (a.toSource() === "({})")  // then 'a' is empty
    

ИЗМЕНИТЬ: Если вы используете какую-либо библиотеку JSON (например, JSON.js), вы можете попробовать функцию JSON.encode() и проверить результат на пустую строку значений.

19
ответ дан 25 марта '09 в 14:48
источник

Использование Object.keys(obj).length(как было предложено выше для ECMA 5+) в 10 раз медленнее для пустых объектов! придерживайтесь опции старой школы (для... in).

Протестировано под Node, Chrom, Firefox и IE 9, становится очевидным, что для большинства случаев использования:

  • (для... in...) - самый быстрый вариант использования!
  • Object.keys(obj).length в 10 раз медленнее для пустых объектов
  • JSON.stringify(obj).length всегда самый медленный (не удивительный)
  • Object.getOwnPropertyNames(obj).length занимает больше времени, чем Object.keys(obj).length может быть намного дольше в некоторых системах.

Эффект нижней линии, используйте:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

или

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

См. подробные результаты тестирования и тестовый код на Является ли объект пустым?

17
ответ дан 28 дек. '16 в 13:40
источник

Я использую это.

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;
    }
15
ответ дан 08 июня '12 в 11:04
источник

В следующем примере показано, как проверить, является ли объект 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
10
ответ дан 29 марта '17 в 13:42
источник
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
10
ответ дан 24 апр. '09 в 16:09
источник


вы можете использовать этот простой код, который не использовал jQuery или другие библиотеки

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

Класс JSON и его функции (parse и stringify) очень полезны, но есть некоторые проблемы с IE7, которые вы можете исправить с помощью этого простой код http://www.json.org/js.html.

Другой простой способ (простейший способ):
вы можете использовать этот способ без использования jQuery или объекта 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
9
ответ дан 28 авг. '13 в 9:33
источник

jQuery имеет специальную функцию isEmptyObject() для этого случая:

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

Подробнее о http://api.jquery.com/jQuery.isEmptyObject/

9
ответ дан 25 янв. '11 в 17:25
источник

Лучший способ, которым я нашел:

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
9
ответ дан 15 марта '17 в 16:32
источник

Если jQuery и веб-браузер недоступны, в underscore.js также есть функция isEmpty.

_.isEmpty({}) // returns true

Кроме того, он не предполагает, что входным параметром является объект. Для списка или строки или undefined он также вернет правильный ответ.

8
ответ дан 14 янв. '14 в 6:02
источник

Мой прием:

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

Просто, я не думаю, что все браузеры реализуют Object.keys() в настоящее время.

8
ответ дан 31 окт. '11 в 16:39
источник

Я бы пошел для проверки, если у него есть хотя бы один ключ. Этого было бы достаточно, чтобы сказать мне, что он не пустой.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
8
ответ дан 11 сент. '18 в 13:35
источник

Простая петля:

var is_empty = true;
for(var i in obj) {
    is_empty = false;
    break;
}
5
ответ дан 10 апр. '15 в 13:32
источник

Правильный ответ:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

Это проверяет, что:

  • Объект не имеет собственных свойств (независимо от перечислимости).
  • Объект не имеет собственных символов свойств.
  • Прототипом объекта является Object.prototype.

Другими словами, объект неотличим от объекта, созданного с помощью {}.

5
ответ дан 09 апр. '18 в 12:37
источник

Согласно спецификации ES2017 для Object.entries(), проверка проста с использованием любого современного browser--

Object.entries({}).length === 0
5
ответ дан 29 дек. '18 в 12:11
источник

Протест! Остерегайтесь ограничений 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

    {}
5
ответ дан 24 мая '11 в 4:52
источник

Sugar.JS предоставляет расширенные объекты для этой цели. Код чист и прост:

Сделайте расширенный объект:

a = Object.extended({})

Проверьте размер:

a.size()
4
ответ дан 16 авг. '12 в 12:46
источник

В дополнение к ответу Thevs:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

it jquery + jquery.json

4
ответ дан 26 февр. '10 в 15:33
источник

Другой альтернативой является использование is.js (14kB) в отличие от jquery (32kB), lodash (50kB) или underscore (16.4kB). is.js оказалась самой быстрой библиотекой среди вышеупомянутых библиотек, которая может быть использована для определения того, пустой объект.

http://jsperf.com/check-empty-object-using-libraries

Очевидно, что все эти библиотеки не совсем одинаковы, поэтому, если вам нужно легко манипулировать DOM, тогда jquery все равно может быть хорошим выбор или если вам нужно больше, чем просто проверка типа, тогда lodash или underscore может быть хорошо. Что касается is.js, вот синтаксис:

var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false

Подобно подчеркиванию и lodash _.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;
}

Это немного быстрее, чем is.js, но только потому, что вы не проверяете, является ли это объектом.

3
ответ дан 05 июня '15 в 20:16
источник
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос