it-swarm.com.ru

Как проверить наличие пустого объекта JavaScript?

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

var a = {};

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

2167
falmp

ECMA 7+ :

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

ECMA 5+ :

// 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 :

jQuery.isEmptyObject({}); // true

Лодаш :

_.isEmpty({}); // true

Нижнее подчеркивание :

_.isEmpty({}); // true

Хук

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

ExtJS

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

AngularJS (версия 1)

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

Рамда

R.isEmpty({}); // true
3686
Adam Zerner

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

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

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

547
Erik Töyrä

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

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

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

_.isEmpty({}); // true
191
Baggz
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

см. http://bencollier.net/2011/04/javascript-is-an-object-empty/

107
es cologne

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

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

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

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

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

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

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

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

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

47
Anish Nair

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

28
download

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

Он использует Object.keys from 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;
    }
}

Вот Gist для этого кода.

А вот JSFiddle с демонстрацией и простым тестом.

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

21
Slava Fomin II

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

if (Object.keys(a).length > 0) {
    // not empty
}
20
Ashutosh Ranjan
  1. Просто обходной путь. Может ли ваш сервер генерировать какое-то специальное свойство в случае отсутствия данных?

    Например:

    var a = {empty:true};
    

    Затем вы можете легко проверить это в своем коде обратного вызова AJAX.

  2. Еще один способ проверить это:

    if (a.toSource() === "({})")  // then 'a' is empty
    

EDIT: Если вы используете какую-либо библиотеку JSON (например, JSON.js), вы можете попробовать функцию JSON.encode () и проверить результат по пустой строке значения.

19
Thevs

Использование Object.keys (obj) .length (как предложено выше для ECMA 5+) в 10 раз медленнее для пустых объектов! сохранить с старой школы (для ... в) вариант.

Протестировано под Node, Chrom, Firefox и IE 9, становится очевидно, что для большинства случаев использования:

  • (для ... in ...) - самый быстрый вариант для использования! 
  • Object.keys (obj). Длина в 10 раз медленнее для пустых объектов
  • JSON.stringify (obj) .length всегда самый медленный (не удивительно)
  • Object.getOwnPropertyNames (obj) .length занимает больше времени, чем Object.keys (obj) .length может быть намного длиннее в некоторых системах.

В конечном итоге, используйте:

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

Смотрите подробные результаты тестирования и тестовый код на Объект пуст?

17
davidhadas

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

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;

отсюда

Обновление

OR

вы можете использовать реализацию jQuery isEmptyObject

function isEmptyObject ( obj ) {
        var name;
        for ( name in obj ) {
            return false;
        }
        return true;
    }
15
kiranvj

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

11
GibboK
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
10
ikettu

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

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

Узнайте больше на http://api.jquery.com/jQuery.isEmptyObject/

10
Anton Danilchenko

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

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
9
DiegoAraujo


Вы можете использовать этот простой код, который не использовал 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
9
iman

Мой дубль:

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

8
NiKo

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

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
8
Tudor Morar

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

_.isEmpty({}) // returns true

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

8
jichi

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

Object.entries({}).length === 0
6
Vikrant

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

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

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

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

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

5
Jesse

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

 возвращает 

 {} 
5
Ekim

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

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

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

это jquery + jquery.json

4
starikovs

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

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

a = Object.extended({})

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

a.size()
4
mikemaccana

Другой альтернативой является использование is.js (14 КБ) в отличие от jquery (32 КБ), lodash (50 КБ) или подчеркивания (16,4 КБ). is.js оказалась самой быстрой библиотекой среди вышеупомянутых библиотек, которую можно использовать для определения того, является ли объект пустым.

http://jsperf.com/check-empty-object-using-libraries

Очевидно, что все эти библиотеки не совсем одинаковы, поэтому, если вам нужно легко манипулировать DOM, тогда jquery может быть хорошим выбором или если вам нужно больше, чем просто проверка типов, тогда lodash или underscore может быть хорошо. Что касается is.js , вот синтаксис:

var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false

Как и _.isObject() подчеркивания и lodash, это не только для objects, но также относится к arrays и strings.

Под капотом эта библиотека использует Object.getOwnPropertyNames, который похож на Object.keys, но Object.getOwnPropertyNames более тщательный, поскольку он будет возвращать перечисляемые и не перечисляемые свойства, как описано здесь .

is.empty = function(value) {
    if(is.object(value)){
        var num = Object.getOwnPropertyNames(value).length;
        if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){
            return true;
        }
        return false;
    } else {
        return value === '';
    }
};

Если вы не хотите использовать библиотеку (что понятно) и знаете, что вы проверяете только объекты (не массивы или строки), тогда следующая функция должна соответствовать вашим потребностям.

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

Это только немного быстрее, чем is.js, хотя только потому, что вы не проверяете, является ли он объектом.

3
cwadding

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

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
2
ahmadalibaloch

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

это вернет true, если по умолчанию ввод вводится в виде Falsey или если это пустой объект или массив. обратная функция trueish

http://codepen.io/synthet1c/pen/pjmoWL

function falsish( obj ){
    if( (typeof obj === 'number' && obj > 0) || obj === true ){
        return false;
    }
    return !!obj
        ? !Object.keys( obj ).length
        : true;
}

function trueish( obj ){
    return !falsish( obj );
}

falsish({})           //=> true
falsish({foo:'bar'})  //=> false
falsish([])           //=> true
falsish(['foo'])      //=> false
falsish(false)        //=> true
falsish(true)         //=> false
// the rest are on codepen
2
synthet1c

этот однострочный код помогает 

var a = {}; //if empty returns false
(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns False

var a = {b:2} //if not empty returns true
(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns true

Object.getOwnPropertyNames реализовано в ECMA-5. вышеприведенная строка работает в старых браузерах с резервной функцией.

JSFiddler

2
Nirus
    isEmpty = function(obj) {
      if (obj == null) return true;
      if (obj.constructor.name == "Array" || obj.constructor.name == "String") return obj.length === 0;
      for (var key in obj) if (isEmpty(obj[key])) return true;
      return false;
    }

Это проверит пустоту строки, массива или объекта (карты).

Использование : 

var a = {"a":"xxx","b":[1],"c":{"c_a":""}}
isEmpty(a); // true, because a.c.c_a is empty.
isEmpty("I am a String"); //false
2
Rahul Malhotra
export function isObjectEmpty(obj) {
  return (
    Object.keys(obj).length === 0 &&
    Object.getOwnPropertySymbols(obj).length === 0 &&
    obj.constructor === Object
  );
}

Это включает проверку объектов, содержащих свойства символов.

Object.keys не возвращает свойства символа.

1
Jplus2

Между тем, у нас может быть одна функция, которая проверяет все «пустые области», такие как null, undefined, '', '', {}, [] .

var isEmpty = function(data) {
    if(typeof(data) === 'object'){
        if(JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]'){
            return true;
        }else if(!data){
            return true;
        }
        return false;
    }else if(typeof(data) === 'string'){
        if(!data.trim()){
            return true;
        }
        return false;
    }else if(typeof(data) === 'undefined'){
        return true;
    }else{
        return false;
    }
}

Варианты использования и результаты.

console.log(isEmpty()); // true
console.log(isEmpty(null)); // true
console.log(isEmpty('')); // true
console.log(isEmpty('  ')); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty({})); // true
console.log(isEmpty([])); // true
console.log(isEmpty(0)); // false
console.log(isEmpty('Hey')); // false
1
Imran

Попробуйте Разрушение

const a = {};
const { b } = a;
const emptryOrNot = (b) ? 'not Empty' : 'empty';
console.log(emptryOrNot)
1
Igor Kokotko

Странно, что я не нахожу здесь сравнение по значениям (может быть, пропущено среди стольких решений) . Я хотел бы охватить случай, когда объект считается пустым, если все его значения не определены: 

const isObjectEmpty = ( obj ) => Object.values( obj  ).every( val => typeof val === "undefined" );

isObjectEmpty({ foo: undefined, bar: undefined }): // true
isObjectEmpty({ foo: false, bar: null }): // false

Таким образом, мы можем расширить, скажем, объект параметров только тогда, когда предоставлены дополнительные параметры

function onSubmit({ fullPage, width, height }) {
const baseOptions = { fullPage },
      clip = { width, height },
      options = isObjectEmpty( clip ) ? baseOptions : { ...baseOptions, clip };
//...
}
0
Dmitry Sheiko

Чистый ванильный Javascript и полная обратная совместимость

function isObjectDefined (Obj) {
  if (Obj === null || typeof Obj !== 'object' ||
    Object.prototype.toString.call(Obj) === '[object Array]') {
    return false
  } else {
    for (var prop in Obj) {
      if (Obj.hasOwnProperty(prop)) {
        return true
      }
    }
    return JSON.stringify(Obj) !== JSON.stringify({})
  }
}

console.log(isObjectDefined()) // false
console.log(isObjectDefined('')) // false
console.log(isObjectDefined(1)) // false
console.log(isObjectDefined('string')) // false
console.log(isObjectDefined(NaN)) // false
console.log(isObjectDefined(null)) // false
console.log(isObjectDefined({})) // false
console.log(isObjectDefined([])) // false
console.log(isObjectDefined({a: ''})) // true
0
João Pimentel Ferreira

Чтобы действительно приниматьONLY{}, лучший способ сделать это в Javascript с использованием Lodash:

_.isEmpty(value) && _.isPlainObject(value)
0
Anthony D'Amato

Вы можете определить свой собственный прототип объекта, непосредственно перед его использованием или в начале вашего кода.

Определение должно выглядеть так:

Object.prototype.hasOwnProperties = function()
{ 
  for (var k in this)
  { 
    if ( this.hasOwnProperty(k) )
    { 
      return true;
    } 
  }
  return false;
}

Вот пример использования:

var a = {};

while ( a.status !== "finished" )
{  
  if ( status === "processing" )
  {
    a.status = "finished";  
  }
  
  if ( status === "starting" )
  {
    a.status = "processing";  
  }
  
  if ( !a.hasOwnProperties() )
  {
    a.status = "starting";
  }
}

Наслаждайтесь! :-)

0
Slavik Meltser

Я возвращал пустой ответ JSON для вызова AJAX, а в IE8 jQuery.isEmptyObject () не проходил корректную проверку. Я добавил дополнительную проверку, которая, кажется, ловит это должным образом.

.done(function(data)
{  
    // Parse json response object
    var response = jQuery.parseJSON(data);

    // In IE 8 isEmptyObject doesn't catch the empty response, so adding additional undefined check
    if(jQuery.isEmptyObject(response) || response.length === 0)
    {
        //empty
    }
    else
    {
        //not empty
    }
});
0
CatTest

Начиная с jQuery 1.4 метод isEmptyObject() проверяет как свойства самого объекта, так и свойства, унаследованные от прототипов (в том смысле, что он не использует hasOwnProperty). Аргумент всегда должен быть простым объектом JavaScript, так как другие типы объектов (элементы DOM, простые строки/числа, объекты хоста) могут не давать согласованных результатов в разных браузерах. Чтобы определить, является ли объект простым JavaScript-объектом, используйте $.isPlainObject().

jQuery.isPlainObject({}) // true

jQuery.isPlainObject( "test" ) // false

JQuery API

0
chandu

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

function isEmpty(obj: Object): Boolean {
    for (const prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            if (obj[prop] instanceof Object) {
                const rtn = this.isEmpty(obj[prop]);
                if (rtn === false) {
                  return false;
                }
            } else if (obj[prop] || obj[prop] === false) {
                return false;
            }
        }
    }
    return true;
}
0
Jonathan