Как проверить пустой объект JavaScript?

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

var a = {};

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

Комментарии к вопросу (1)
Решение

ECMA 7+:

// because Object.entries(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

До 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
Комментарии (28)

Нет простого способа сделать это. Вам придется явно перебирать свойства:

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;
}
Комментарии (16)

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

Комментарии (16)

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

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Комментарии (5)

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

_.isEmpty({}); // true
Комментарии (8)
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

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

Комментарии (4)

Как насчет С помощью JSON.преобразовать в строки? Это почти во всех современных браузерах.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}
Комментарии (5)

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

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
Комментарии (2)

Я просто столкнулся с аналогичной ситуацией. Я не'т хотите использовать jQuery, и хотел сделать это с помощью чистого JavaScript.

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

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

Не равен, используйте это : в JSON.преобразовать в строки(параметр obj) !== '{}'

Проверить это [JSFiddle][1]

Комментарии (7)

Есть простой способ если вы находитесь на новый браузер. Объект.ключи(объект).длина == 0

Комментарии (5)

Вы можете проверить количество ключей объекта:

if (Object.keys(a).length > 0) {
    // not empty
}
Комментарии (2)
  1. Просто обходной путь. Может ли ваш сервер генерировать какое-то специальное свойство в случае отсутствия данных?

Например:

    var a = {empty:true};

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

  1. Другой способ проверки:

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

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

Комментарии (11)

Используя Объект.ключи(объект).длина (как предложено выше для ECMA 5+) в 10 раз медленнее на пустые объекты! сохранить со старой школы (для...В) вариант.

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

  • (ПО...в...) самый быстрый вариант использовать!
  • Объекта.ключи(объект).длина в 10 раз медленнее для пустых объектов
  • В формате JSON.преобразовать в строки(объект).длина всегда самый медленный (не удивительно)
  • Объекта.getOwnPropertyNames(объект).длина занимает больше времени, чем объект.ключи(объект).длина может быть гораздо длиннее на некоторых системах.

Итог производительность мудрый, используйте:

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;
}

Ознакомиться с подробными результатами тестирования и тестирования кода в https://stackoverflow.com/questions/4994201/is-object-empty/34491287#34491287

Комментарии (0)

Я'вэ, созданных полной функции, чтобы определить, если объект пуст.

Он использует объект [.ключи][МДН-объект-ключи] от в 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][jsfiddle] с демонстрацией и простой тест.

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

Комментарии (4)

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

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;
    }
Комментарии (2)

В следующем примере показано, как проверить, если JavaScript-объект пустой, если пустой то значит имеет собственные свойства.

Скрипт работает на ЕС6.

в

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

в

Комментарии (0)
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
Комментарии (1)

в соответствии с ES2017 спецификация объекта.записи(), проверка просто с помощью любого современного браузера--

Object.entries({}).length === 0
Комментарии (2)

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

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

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

Комментарии (2)

Под капотом все пустые методы проверки во всех библиотеках используйте клавиши объект проверки логикой. Его странный способ, чтобы сделать это понятным, который вы можете положить в способ, описанный здесь.

for(key in obj){
   //your work here.
 break;
}

Который превратился в в ES5, теперь просто вы можете проверить объект's длина ключей, используя объект.Метод ключей, который берет свой объект, как это's параметр:

if(Object.keys(obj).length > 0){
 //do your work here
}

Или если вы используете Лодашь (Вы должны быть) потом.

 _.isEmpty(obj) //==true or false
Комментарии (1)