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

var a = {};

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

2975
falmp 25 Мар 2009 в 04:39

28 ответов

Лучший ответ

ECMA 5+:

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

Обратите внимание, что это создает ненужный массив (возвращаемое значение keys).

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

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

_.isEmpty({}); // true

Хук

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

ExtJS

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

AngularJS (версия 1)

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

Ramda

R.isEmpty({}); // true
5223
14 revs, 14 users 53% 8 Мар 2020 в 14:24

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

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
60
peterh - Reinstate Monica 22 Май 2017 в 17:32

В следующем примере показано, как проверить, является ли объект 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
15
LostMyGlasses 20 Июл 2018 в 12:38

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

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}
79
Saikat Guha 18 Мар 2015 в 09:31

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

38
download 29 Апр 2012 в 19:25
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

См. http://bencollier.net/2011/04/javascript-is-an-object- пустой /

114
es cologne 6 Ноя 2013 в 13:48

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

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

a = Object.extended({})

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

a.size()
6
mikemaccana 16 Авг 2012 в 09:46

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

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;
}
844
mb21 29 Авг 2014 в 10:30

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

_.isEmpty({}) // returns true

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

9
jichi 14 Янв 2014 в 03:02

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

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

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

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

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

7
Jesse 5 Июн 2018 в 01:27

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

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

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

Это jquery + jquery.json

6
starikovs 26 Фев 2010 в 12:33

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

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
11
ahmadalibaloch 28 Янв 2019 в 11:42

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

566
Erik Töyrä Silfverswärd 19 Май 2010 в 14:07

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

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
10
DiegoAraujo 15 Мар 2017 в 13:32

Мой дубль:

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().

9
NiKo 31 Окт 2011 в 13:39

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

Object.entries({}).length === 0
14
Vikrant 29 Дек 2018 в 09:11

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

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

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

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

Проверьте это JSFiddle

60
Anish Nair 14 Апр 2015 в 04:45

Производительность

Сегодня 2020.01.17 я выполняю тесты на MacO HighSierra 10.13.6 на Chrome v79.0, Safari v13.0.4 и Firefox v72.0 для выбранных решений.

< STRONG> Выводы

  • решения на основе for-in (A, J, L, M) являются самыми быстрыми
  • решения на основе JSON.stringify (B, K) являются медленными
  • также неожиданно решение, основанное на Object (N), является медленным

enter image description here

Детали

Ниже во фрагменте представлены 15 решений. Если вы хотите запустить тест производительности на своем компьютере, нажмите ЗДЕСЬ.

var log = (s,f) => console.log(`${s} --> {}:${f({})}  {k:2}:${f({k:2})}`);

function A(obj) {
  for(var i in obj) return false; 
  return true;
}

function B(obj) {
  return JSON.stringify(obj) === '{}';
}

function C(obj) {
  return Object.keys(obj).length === 0;
}

function D(obj) {
  return Object.entries(obj).length === 0;
}

function E(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

function F(obj) {
  return Object.keys(obj).length === 0 && obj.constructor === Object;
}

function G(obj) {
  return typeof obj === "undefined" || !Boolean(Object.keys(obj)[0]);
}

function H(obj) {
  return Object.entries(obj).length === 0 && obj.constructor === Object;
}

function I(obj) {
  return Object.values( obj  ).every( val => typeof val === "undefined" );
}

function J(obj) {
  for (const key in obj) {
    if (hasOwnProperty.call(obj, key)) {
      return false
    }
  }
  return true;
}

function K(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      return false;
    }
  }

  return JSON.stringify(obj) == JSON.stringify({});
}

function L(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
      return false;
  }

  return true;
}

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

function N(obj) {
  return Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype; 
}

function O(obj) {
  return !(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(obj).length != 0 : (function(){for(var key in obj) break; return (key != null) && (key != undefined);})())
}

log('A',A);
log('B',B);
log('C',C);
log('D',D);
log('E',E);
log('F',F);
log('G',G);
log('H',H);
log('I',I);
log('J',J);
log('K',K);
log('L',L);
log('M',M);
log('N',N);
log('O',O);

enter image description here

20
Kamil Kiełczewski 17 Янв 2020 в 12:53

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

_.isEmpty({}); // true
201
Gabriel GM 21 Янв 2016 в 15:54

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

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

Подробнее читайте в http://api.jquery.com/jQuery.isEmptyObject/

12
Anton DanilchenkoAnton Danilchenko 25 Янв 2011 в 14:25
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
13
Lightness Races in Orbit 1 Ноя 2011 в 08:26

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

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
11
Tudor Morar 9 Янв 2019 в 18:27

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

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
261
dhruvio 12 Июл 2014 в 07:46


Вы можете использовать этот простой код, который не использовал 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
10
iman 3 Сен 2013 в 04:34

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

    {}
7
Ekim 24 Май 2011 в 01:52

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

Он использует Object.keys из ECMAScript 5 (ES5), если это возможно, для достижения наилучшей производительности (см. < a href = "http://kangax.github.io/compat-table/es5/#Object.keys" rel = "noreferrer"> таблица совместимости ) и откат к наиболее совместимому подходу для старых механизмов (браузеров) ) .

Решение

/**
 * 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 с демонстрацией и простым тестом.

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

24
Slava Fomin II 25 Апр 2017 в 23:42

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

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;
}
19
ns16 5 Фев 2020 в 08:58

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

if (Object.keys(a).length > 0) {
    // not empty
}
31
danopz 30 Июн 2017 в 12:22
679915