После запроса AJAX иногда мое приложение может возвращать пустой объект, например:
var a = {};
Как я могу проверить, является ли это случай?
После запроса AJAX иногда мое приложение может возвращать пустой объект, например:
var a = {};
Как я могу проверить, является ли это случай?
// because Object.entries(new Date()).length === 0;
// we have to do some additional check
Object.entries(obj).length === 0 && obj.constructor === Object
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
Pre-ECMA 5:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery.isEmptyObject({}); // true
_.isEmpty({}); // true
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // 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;
}
Для тех из вас, кто имеет ту же проблему, но использует jQuery, вы можете использовать jQuery.isEmptyObject.
Это мое предпочтительное решение:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Вы можете использовать Underscore.js.
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
см. http://bencollier.net/2011/04/javascript-is-an-object-empty/
Как насчет использования JSON.stringify? Он доступен почти во всех современных браузерах.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
Старый вопрос, но у него была проблема. Включение JQuery на самом деле не является хорошей идеей, если ваша единственная цель - проверить, не объект ли пуст. Вместо этого, просто в код JQuery, и вы получите ответ:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
Я столкнулся с подобной ситуацией. Я не хотел использовать JQuery и хотел сделать это, используя чистый Javascript.
И что я сделал, использовал следующее условие, и это сработало для меня.
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
Для не равных, используйте это: JSON.stringify(obj) !== '{}'
Посмотрите JSFiddle
Существует простой способ, если вы находитесь в более новом браузере.
Object.keys(obj).length == 0
Вы можете проверить количество клавиш Object:
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() и проверить результат на пустую строку значений.
Я создал полную функцию, чтобы определить, является ли объект пустым.
Он использует функциональные возможности 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(obj).length(как было предложено выше для ECMA 5+) в 10 раз медленнее для пустых объектов! придерживайтесь опции старой школы (для... in).
Протестировано под Node, Chrom, 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;
}
См. подробные результаты тестирования и тестовый код на Является ли объект пустым?
Я использую это.
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
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Согласно спецификации ES2017 для Object.entries(), проверка проста с использованием любого современного browser--
Object.entries({}).length === 0
jQuery имеет специальную функцию isEmptyObject()
для этого случая:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
Подробнее о http://api.jquery.com/jQuery.isEmptyObject/
Под капотом все пустые методы проверки во всех библиотеках используют логику проверки ключей объекта. Это странный способ сделать его понятным, который вы можете добавить в метод, описанный здесь.
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
Я бы пошел для проверки, если у него есть хотя бы один ключ. Этого было бы достаточно, чтобы сказать мне, что он не пустой.
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
вы можете использовать этот простой код, который не использовал 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
Лучший способ, которым я нашел:
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
Мой прием:
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()
в настоящее время.
Если jQuery и веб-браузер недоступны, в underscore.js также есть функция isEmpty.
_.isEmpty({}) // returns true
Кроме того, он не предполагает, что входным параметром является объект. Для списка или строки или undefined он также вернет правильный ответ.
Протест! Остерегайтесь ограничений 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 {}
Правильный ответ:
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
it jquery + jquery.json
Sugar.JS предоставляет расширенные объекты для этой цели. Код прост и понятен:
Сделайте расширенный объект:
a = Object.extended({})
Проверьте размер:
a.size()
Простая петля:
var is_empty = true;
for(var i in obj) {
is_empty = false;
break;
}