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

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

var a = {};

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

Ответы [ 44 ]

9 голосов
/ 15 марта 2017

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

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 голосов
/ 31 октября 2011

Мой дубль:

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 голосов
/ 14 января 2014

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

_.isEmpty({}) // returns true

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

7 голосов
/ 29 декабря 2018

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

Object.entries({}).length === 0
5 голосов
/ 24 мая 2011

Протест! Остерегайтесь ограничений 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 голосов
/ 09 апреля 2018

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

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

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

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

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

4 голосов
/ 26 февраля 2010

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

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

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

это jquery + jquery.json

4 голосов
/ 16 августа 2012

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

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

a = Object.extended({})

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

a.size()
4 голосов
/ 15 мая 2014

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

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

, который развился в ES5 , проще говоря, вы можете проверить длину ключей объекта, используя метод Object.Keys, который принимает ваш объект в качестве параметра:

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

Или, если вы используете Lodash (вы должны быть), то.

 _.isEmpty(obj) //==true or false
3 голосов
/ 05 июня 2015

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

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

Очевидно, что все эти библиотеки не совсем одинаковы, поэтому, если вам нужно легко манипулировать DOM, тогда jquery может быть хорошим выбором или если вам нужно больше, чем просто проверка типов, тогда lodash или подчеркивание может быть хорошим. Что касается is.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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...