Как проверить наличие пустого объекта JavaScript? - PullRequest
2367 голосов
/ 25 марта 2009

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

var a = {};

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

Ответы [ 44 ]

21 голосов
/ 30 июня 2017

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

if (Object.keys(a).length > 0) {
    // not empty
}
21 голосов
/ 21 мая 2014

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

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

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

20 голосов
/ 25 марта 2009
  1. Просто обходной путь. Может ли ваш сервер генерировать какое-то специальное свойство в случае отсутствия данных?

    Например:

    var a = {empty:true};
    

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

  2. Еще один способ проверить это:

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

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

17 голосов
/ 28 декабря 2015

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

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

  • (для ... in ...) - самый быстрый вариант использования!
  • Object.keys (obj). Длина для пустых объектов в 10 раз медленнее
  • JSON.stringify (obj). Длина всегда самая медленная (не удивительно)
  • 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;
}

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

15 голосов
/ 08 июня 2012

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

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;

отсюда

Обновление

OR

вы можете использовать реализацию jQuery isEmptyObject

function isEmptyObject ( obj ) {
        var name;
        for ( name in obj ) {
            return false;
        }
        return true;
    }
12 голосов
/ 29 марта 2017

В следующем примере показано, как проверить, является ли объект 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
11 голосов
/ 24 апреля 2009
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
10 голосов
/ 25 января 2011

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

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

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

9 голосов
/ 28 августа 2013


Вы можете использовать этот простой код, который не использовал 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 голосов
/ 11 сентября 2018

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

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...