Після запиту AJAX іноді моя програма може повернути порожній об'єкт, наприклад:
var a = {};
Як я можу перевірити, чи так це?
if( Object.entries(a).length > 0){ //do }
Після запиту AJAX іноді моя програма може повернути порожній об'єкт, наприклад:
var a = {};
Як я можу перевірити, чи так це?
if( Object.entries(a).length > 0){ //do }
Відповіді:
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
).
Попередньо 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
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
Object.keys(new Date()).length === 0
; тому ця відповідь може бути оманливою.
(new Date()).constructor === Date
або , навпаки, ({}).constructor === Object
.
Object.keys()
не перевіряє незліченні властивості чи символи. Вам потрібно використовувати Object.getOwnPropertyNames()
і Object.getOwnPropertySymbols()
замість цього. Також, Object.getPrototypeOf()
це правильний спосіб отримати прототип об'єкта. obj.constructor
можна легко підробити. Приклад: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.
Немає простого способу зробити це. Вам доведеться чітко переглядати властивості:
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;
}
isEmpty()
, тому вона повинна повертатися, false
якщо вона має властивість
Для тих, хто має таку ж проблему, але використовує jQuery, ви можете використовувати jQuery.isEmptyObject .
underscore.js
...
Це моє бажане рішення:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Object.keys(new Date()).length === 0
; тому ця відповідь може бути оманливою.
new Date()
не є об’єктом. nd = new Date(); nd.constructor === Object;
результати в false
.
Ви можете використовувати Underscore.js .
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
див. http://bencollier.net/2011/04/javascript-is-an-object-empty/
Object.getOwnPropertyNames(new Date()).length === 0
; тому ця відповідь може бути оманливою.
Як щодо використання JSON.stringify? Він майже доступний у всіх сучасних браузерах.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
Я просто зіткнувся з подібною ситуацією. Я не хотів використовувати JQuery, і хотів це зробити за допомогою чистого Javascript.
І те, що я зробив, використав наступну умову, і це працювало на мене.
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
Використовуйте це: JSON.stringify(obj) !== '{}'
Перевірте цей JSFiddle
Старе запитання, але просто виникло питання. Включення JQuery насправді не є хорошою ідеєю, якщо ваша єдина мета - перевірити, чи об’єкт не порожній. Натомість просто заглибившись у код JQuery , і ви отримаєте відповідь:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
Існує простий спосіб, якщо ви перебуваєте в новому браузері.
Object.keys(obj).length == 0
Object.keys
це стандартний метод, але об'єкти не мають властивості ключів. Таким чином, цей код повідомляє про будь-який об’єкт порожнім, за винятком випадкових випадків, коли він має властивість з ім'ям, яке key
має значення, яке знову називається властивістю, length
яке не має нуля. Жахливо!
Object.keys(new Date()).length === 0
; тому ця відповідь може бути оманливою.
Використання Object.keys (obj) .length (як запропоновано вище для ECMA 5+) у 10 разів повільніше для порожніх об'єктів! тримайся зі старої школи (для ... в) варіант.
Перевірено під Node, Chrome, Firefox та IE 9, стає очевидним, що для більшості випадків використання:
Підсумкові результати роботи:
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;
}
Дивіться детальні результати тестування та код тесту на сторінці Чи об’єкт порожній?
Object.keys
повільно, але менше коду. На невеликій сторінці, де це називається ... можливо в 10 разів ... Чи все ж це буде повільніше, враховуючи час розбору додаткового коду?
Сьогодні 2020.01.17 я виконую тести на MacOs HighSierra 10.13.6 на Chrome v79.0, Safari v13.0.4 та Firefox v72.0, для обраних рішень.
Висновки
for-in
(A, J, L, M) найшвидшіJSON.stringify
(В, К) повільніObject
(N) повільнеНижче в фрагменті представлено 15 рішень. Якщо ви хочете запустити перевірку працездатності на своєму апараті, натисніть ТУТ .
Ви можете перевірити кількість ключів об'єкта:
if (Object.keys(a).length > 0) {
// not empty
}
Просто вирішення. Чи може ваш сервер генерувати якусь особливу властивість у випадку відсутності даних?
Наприклад:
var a = {empty:true};
Тоді ви можете легко перевірити це у своєму коді зворотного дзвінка AJAX.
Ще один спосіб перевірити це:
if (a.toSource() === "({})") // then 'a' is empty
EDIT : Якщо ви використовуєте будь-яку бібліотеку JSON (fe JSON.js), ви можете спробувати функцію JSON.encode () і перевірити результат на порожній рядок значення.
toSource()
є нестандартним і не працює в IE або Opera (і, можливо, інших браузерах я не перевіряв)
toSource
властивість у розділі 15.2.4; згідно MDC, він був представлений в JS1.3 (тобто Netscape Navigator 4.06), але це НЕ в ECMA-262, 3-е видання!
toSource()
це жахливий спосіб зробити це (як є JSON.encode()
). Для цього потрібно створити рядок, що представляє весь ваш об'єкт, щоб просто перевірити, чи порожній він. Існує накладні витрати на перетворення речей у рядки, але крім того, для конвертації мільйона речей, якщо ваш об’єкт має мільйон властивостей, потрібно буде, а насправді лише дивлячись на один, ви дасте зрозуміти, що він не порожній.
Я створив повну функцію, щоб визначити, чи об’єкт порожній.
Він використовує 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 з демонстрацією та простим тестом.
Сподіваюся, це комусь допоможе. Ура!
Object.keys(new Date()).length === 0
; тому ця відповідь може бути оманливою.
Я цим користуюся.
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;
}
Наведений нижче приклад показує, як перевірити, чи об’єкт 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
Відповідно до специфікації ES2017 для Object.entries () , перевірка проста за допомогою будь-якого сучасного браузера--
Object.entries({}).length === 0
Object.keys
або Object.values
?
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Object
методом через прототип ланцюга, тому що це перелічується, а for in
оператор проходить через численні властивості.
jQuery мають спеціальну функцію isEmptyObject()
для цього випадку:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
Детальніше читайте на http://api.jquery.com/jQuery.isEmptyObject/
Я б хотів перевірити, чи є у нього хоча б один ключ. Цього було б достатньо, щоб сказати мені, що це не порожньо.
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
значення? результат буде false
невірним.
Під кришкою всі порожні методи перевірки у всіх бібліотеках використовують об'єктивні ключі перевірки логіки. Це незвичайний спосіб зробити його зрозумілим, який ви можете вкласти методом, описаним тут .
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
ви можете використовувати цей простий код, який не використовував jQuery або інші бібліотеки
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
Клас JSON та його функції ( синтаксичний аналіз та поглинання ) дуже корисні, але є деякі проблеми з 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
Найкращий спосіб, який я знайшов:
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
if (!obj && obj !== 0)
.
Приймаю:
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()
.
Object.keys(new Date()).length === 0
; тому ця відповідь може бути оманливою.
Якщо jQuery і веб-браузер недоступні, в underscore.js також є функція isEmpty.
_.isEmpty({}) // returns true
Крім того, він не передбачає, що вхідний параметр є об'єктом. Для списку або рядка або невизначеного, він також поверне правильну відповідь.
Кава! Остерігайтеся обмежень 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 ) );
дисплеї
Обережно !! obj НЕ порожній! obj = {f: function () {}} JSON.stringify (obj) повертає {}
Правильна відповідь:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
Це перевіряє, що:
Object.prototype
.Іншими словами, об’єкт не відрізняється від створеного с {}
.
Окрім відповіді Thevs:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
це jquery + jquery.json
$.isEmptyObject()
, не витрачайте цикли на неочевидні перетворення.
Sugar.JS забезпечує розширені об'єкти для цієї мети. Код чистий і простий:
Зробіть розширений об’єкт:
a = Object.extended({})
Перевірте розмір:
a.size()