Питання Як перевірити порожній об'єкт JavaScript?


Після запиту AJAX іноді моя заявка може повернути порожній об'єкт, наприклад:

var a = {};

Як перевірити, чи є це справа?


1874
2018-03-25 01:39


походження


Ви використовуєте скрипт JSON.js? Або будь-яка інша бібліотека JSON. Потім ви можете використовувати функцію JSON.encode () для перетворення var у рядок, а потім перевірити його. - Thevs


Відповіді:


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

логода:

_.isEmpty({}); // true

Підкреслити:

_.isEmpty({}); // true

Хок

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

ExtJS

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

AngularJS (версія 1)

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

Рамда

R.isEmpty({}); // true

3088
2018-03-25 01:49



Ось тест продуктивності між jQuery та підкресленням jsperf.com/isempty-vs-isemptyobject/6 - Mikhail
Object.keys(new Date()).length === 0; тому ця відповідь може бути оманливою. - cjbarth
Замість того, щоб змінювати речі, ви також можете скористатися цим фактом: (new Date()).constructor === Date, або навпаки ({}).constructor === Object. - John Nelson
кутовий рівний ({}, {}); - Jeremy A. West
Object.keys() не перевіряє неперелічені властивості або символи. Ви повинні використовувати Object.getOwnPropertyNames() і Object.getOwnPropertySymbols() замість цього. Крім того, Object.getPrototypeOf() це правильний спосіб отримати прототип об'єкта. obj.constructor може бути легко підробленою. Приклад: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true. - Jesse


Простий спосіб це зробити. Ви повинні будете циклу над властивостями явно:

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

747
2018-05-19 14:07



Це добре працює, або просто: функція isEmpty (об'єкт) {for (var i in object) {return true; } return false; } - Nicholas Kreidberg
Не слід ігнорувати справжню і помилкову цю функцію? - namtax
@nametax: no - назва функції isEmpty(), тому він повинен повернутися false якщо він має власність - Christoph
порожній об'єкт буде розширювати клас Object за замовчуванням, але якщо буде змінений прототип об'єкта, спрощена функція не виконає наступне: Object.prototype.a = 'hi'; var obj = {}; оповіщення (obj.a); // виводить "привіт" isEmpty (obj) // повертає false - venimus
Ви не повинні використовувати другий приклад, оскільки це O (n) складності часу та O (n) простору, тоді як перша - O (1). - Brian


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


539
2018-03-22 20:35



Гей! Я просто витратив кілька годин на налагодження проблем з IE 8 лише для того, щоб виявити, що це викликало проблему саме jQuery.isEmptyObject. Це повертає true, якщо об'єкт порожній. - MFD3000
Чому ви публікуєте відповідь, включаючи jQuery, якщо питання взагалі не стосується jQuery? - Eru
Я знаю його старий коментар, але мені цікаво ваше запитання @ MFD3000, тому що документ говорить: повертає true, якщо об'єкт порожній (як показує це ім'я) - Александр Фишер
в тому числі jQuery для такого базового завдання, не те, що я назвав би правильною відповіддю. Справді, сьогодні jQuery майже повний, але ми не повинні забувати, що вона побудована навколо дуже здатної мови. - Pablo Mescher
Типовий снобізм JS в цих коментарях. Всі знають, що велика частина JavaScript в Інтернеті написана на jQuery, тому цілком прийнятно запропонувати рішення для jQuery, якщо у нього вже є вбудований метод тестування об'єктів. Можливо, що тисячі розробників, які шукають допомогу, знайдуть цю відповідь корисною. Ніхто не сказав, що це єдиний спосіб це зробити. Я помічаю, як ніхто не діє на всіх елітарних актах про хлопця, який опублікував рішення для використання underscore.js... - BadHorsie


Ви можете використовувати Underscore.js.

_.isEmpty({}); // true

184
2017-07-12 07:46



Або ви можете використовувати логас порожній (lodash.com/docs#isEmpty), але як це відрізняється від використання рішення jQuery - вам все одно потрібно встановити додаткову бібліотеку. Я думаю, що рішення ванільного JavaScript - це намір. - tfmontague
Це відрізняється, якщо ви хочете використовувати JS на бекенді з Node.js. Мало хто хоче використати jQuery (інтерфейсну бібліотеку, яка використовується переважно для маніпуляцій DOM) на бекенда. - Nahn
@tfmontague підкреслення є дуже поширеним у додатках вузлів, майже повсюдним, оскільки jQ знаходиться на стороні клієнта. Я вже мав напис підкреслення, але не зрозумів, що має цю функцію - rw-nandemo
Підкреслення замінюється лодошем. Використовуйте це замість цього. - demisx
Просто будьте обережні з типом Date, isEmpty завжди повертає істину для Date, див github.com/jashkenas/underscore/issues/445 - mentat


Це моє бажане рішення:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

181
2017-11-06 13:48



Сумісність із IE9 BTW. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - doublejosh
Чи працює це рішення з ie8? - Jero Franzani
@ Джере Францані: ні, це не так - nikoskip
Довжина Object.keys ({}) у 10 разів нижча, ніж параметр (для ... в ...) - я рекомендую уникнути його як спосіб перевірити, чи є objetc порожнім. - davidhadas
Object.keys(new Date()).length === 0; тому ця відповідь може бути оманливою. - cjbarth


if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

побачити http://bencollier.net/2011/04/javascript-is-an-object-empty/ 


103
2018-01-23 20:07



Це не працює в IE8 та нижче. - Stilltorik
Це включає в себе неперераховане властивості, якщо ви будете доглядати.
Довжина Object.getOwnPropertyNames ({}) довжина в 10 разів нижча, ніж параметр (для ... в ...) - я рекомендую уникнути його як спосіб перевірити, чи є objetc порожнім. - davidhadas
Object.getOwnPropertyNames(new Date()).length === 0; тому ця відповідь може бути оманливою. - cjbarth


Як щодо використання JSON.stringify? Він практично доступний у всіх сучасних браузерах.

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

62
2018-01-31 10:55



повернення (JSON.stringify (obj) == '()') - Vic
Це повільне і швидке значення для такого роду корисності. Швидкий пробір тест тут: jsperf.com/empty-object-test - rur
Це дуже повільний варіант - я пропоную скористатися опцією (для ... в) - davidhadas
І це не працює для об'єктів, які містять функції. - Felix Kling


Старе питання, але виникла проблема. Включення JQuery насправді не є гарною ідеєю, якщо ваша мета полягає лише в тому, щоб перевірити, чи об'єкт не порожній. Замість цього, просто вглиб Код JQuery, і ви отримаєте відповідь:

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

51
2017-09-22 05:38



Це корисно лише тоді, коли якийсь інший процес не додає прототипу до вашого базового об'єкта. Щоб зробити це дійсно працездатним, потрібно протестувати за obj.hasOwnProperty (ім'я) - mpemburn


Я просто зіткнувся з подібною ситуацією. Я не хотів використовувати JQuery, і хотів це зробити, використовуючи чистий Javascript.

І те, що я зробив, використовувало таку умову, і це працювало для мене.

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

Не для рівних використовуйте це: JSON.stringify(obj) !== '{}'

Перевірте це JSFiddle


42
2018-04-29 19:25



Помилка для об'єктів з круглими посиланнями, як JSON.stringify конкретно викидає для них виключення. - Pedro Montoto García
@ PedroMontotoGarcía Добре, і як порожній об'єкт матиме кругове посилання? - KthProg
Якщо об'єкт не порожній (і він повинен працювати і для них). - Pedro Montoto García
Це, здається, вже згадувалося компанією @Ateszki і є одним з найпотрібніших способів перевірити, чи є об'єкт не порожнім. - cwadding
О, так, я пропустив це. Я потрапив в ситуацію, коли я хотів досягти цього JavaScript, і після трохи мислення я зрозумів так. @Ateszki, Навіть я, як ви зробили. :-) До речі, на це було багато відповідей, і тому я пропустив вашу відповідь. - Anish Nair


Існує простий спосіб, якщо ви знаходитесь у новому браузері. Object.keys(obj).length == 0


21
2018-05-21 13:55



Де це? keys власність приходить?
Це стандартний метод в ECMAScript 5.1 - download
Як вищезгаданий коментар може містити 4 аплікації? так, Object.keys є стандартним методом, але об'єкти не мають властивостей ключів. Таким чином, цей код повідомлятиме будь-який об'єкт як порожній, крім випадків, коли маєте властивість key з значенням, яке знову як властивість називається length що не дорівнює нулю. Жахливо! - scravy
Object.keys(new Date()).length === 0; тому ця відповідь може бути оманливою. - cjbarth
@scravy Об'єкт - клас об'єкта. Об'єкт має статичний метод, названий 'keys', який приймає об'єкт як аргумент. Цей метод повертає масив рядків, де рядки - це імена властивостей. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Sgnl