После 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
).
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
Лодаш :
_.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
это стандартный метод, но у объектов нет свойства keys. Таким образом, этот код будет сообщать о любом объекте как о пустом, за исключением того, что случайно получено свойство, имя которого key
имеет значение, которое снова в качестве свойства, length
которое не равно нулю. Ужасный!
Object.keys(new Date()).length === 0
; поэтому этот ответ может вводить в заблуждение.
Сегодня 2020.01.17 я выполняю тесты на MacO HighSierra 10.13.6 на Chrome v79.0, Safari v13.0.4 и Firefox v72.0 для выбранных решений.
Выводы
for-in
(A, J, L, M) являются самыми быстрымиJSON.stringify
(B, K) являются медленнымиObject
(N) является медленнымНиже во фрагменте представлены 15 решений. Если вы хотите запустить тест производительности на вашем компьютере, нажмите ЗДЕСЬ .
Использование 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 раз ... Будет ли это все еще медленнее, учитывая дополнительное время разбора дополнительного кода?
Вы можете проверить количество ключей объекта:
if (Object.keys(a).length > 0) {
// not empty
}
Просто обходной путь. Может ли ваш сервер генерировать какое-то специальное свойство в случае отсутствия данных?
Например:
var a = {empty:true};
Тогда вы можете легко проверить это в своем коде обратного вызова AJAX.
Еще один способ проверить это:
if (a.toSource() === "({})") // then 'a' is empty
РЕДАКТИРОВАТЬ : Если вы используете любую библиотеку JSON (например, 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 () , проверка просто с помощью любого современного browser--
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 и его функции ( синтаксический анализ и 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
Лучший способ, который я нашел:
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 = {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()