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

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

var a = {};

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

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

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

lodash:

_.isEmpty({}); // true

Underscore:

_.isEmpty({}); // true

Hoek

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

ExtJS

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

AngularJS (версия 1)

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

Ramda

R.isEmpty({}); // true
3439
ответ дан Adam Zerner 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;
}
763
ответ дан Christoph 25 марта '09 в 4:49
источник поделиться

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

542
ответ дан Erik Töyrä 19 мая '10 в 17:07
источник поделиться

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

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

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

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

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

105
ответ дан es cologne 06 нояб. '13 в 16:48
источник поделиться

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

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

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

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
52
ответ дан Jonathan Petitcolas 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

43
ответ дан Anish Nair 22 сент. '14 в 8:38
источник поделиться

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

24
ответ дан download 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;
    }
}

Здесь Gist для этого кода.

И здесь JSFiddle с демонстрацией и простым тестом.

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

20
ответ дан Slava Fomin II 21 мая '14 в 16:55
источник поделиться

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

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

    Например:

    var a = {empty:true};
    

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

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

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

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

17
ответ дан Thevs 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;
}

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

16
ответ дан davidhadas 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;
    }
14
ответ дан kiranvj 08 июня '12 в 11:04
источник поделиться
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
9
ответ дан ikettu 24 апр. '09 в 16:09
источник поделиться

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

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
8
ответ дан DiegoAraujo 15 марта '17 в 16:32
источник поделиться


вы можете использовать этот простой код, который не использовал 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
8
ответ дан iman 28 авг. '13 в 9:33
источник поделиться

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

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

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

8
ответ дан Anton Danilchenko 25 янв. '11 в 17:25
источник поделиться

В следующем примере показано, как проверить, является ли объект 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
8
ответ дан GibboK 29 марта '17 в 13:42
источник поделиться

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

_.isEmpty({}) // returns true

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

7
ответ дан jichi 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() в настоящее время.

6
ответ дан NiKo 31 окт. '11 в 16:39
источник поделиться

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

Boolean(Object.keys({...obj})[0])
6
ответ дан Tudor Morar 11 сент. '18 в 13:35
источник поделиться

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

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

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

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

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

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

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

4
ответ дан Jesse 09 апр. '18 в 12:37
источник поделиться

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

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

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

it jquery + jquery.json

3
ответ дан starikovs 26 февр. '10 в 15:33
источник поделиться

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

    {}
3
ответ дан Ekim 24 мая '11 в 4:52
источник поделиться

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

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

a = Object.extended({})

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

a.size()
3
ответ дан mikemaccana 16 авг. '12 в 12:46
источник поделиться

Другой альтернативой является использование 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
ответ дан cwadding 05 июня '15 в 20:16
источник поделиться

Попробуйте Destructuring

const a = {};
const { b } = a;
const emptryOrNot = (b) ? 'not Empty' : 'empty';
console.log(emptryOrNot)
2
ответ дан Igor Kokotko 08 нояб. '17 в 14:06
источник поделиться
  • 1
  • 2

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