web-dev-qa-db-ja.com

空のJavaScriptオブジェクトをテストする方法

AJAXリクエストの後、私のアプリケーションは空のオブジェクトを返すことがあります。

var a = {};

そうであるかどうかをどうやって確認できますか?

2308
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

プレ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

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 support が利用可能な場合は、代わりに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

私はちょうど似たような状況に遭遇しました。私は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;
    }
}

これがこのコードの 要旨 です。

そしてここに JSFiddle のデモと簡単なテストがあります。

誰かに役立つことを願っています。乾杯!

21
Slava Fomin II

Objectキーの数を確認できます。

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倍遅くなります。オールドスクール(for ... in)オプションを守ってください。

Node、Chrom、Firefox、およびIE 9でテストしたところ、ほとんどのユースケースで以下のことが明らかになりました。

  • (for ... in ...)を使用するのが最も速いオプションです。  
  • Object.keys(obj).lengthは空のオブジェクトに対して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

あなたはisEmptyObjectのjQuery実装を使用することができます

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

私が見つけた最良の方法:

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 _ classおよびその関数( parse および stringify )は非常に便利ですが、IE7に関するいくつかの問題を解決できますこの簡単なコードで http://www.json.org/js.html

その他の単純な方法(最も単純な方法):
jQuery または _ json _ objectを使用せずにこの方法を使用できます。

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とWebブラウザが利用できない場合は、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は空ではありません!
 
 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

もう1つの方法は、 jquery (32kB)、 lodash (50kB)、または アンダースコア ではなく、 is.js (14kB)を使用することです。 (16.4kB) is.jsは、オブジェクトが空かどうかを判断するために使用できる前述のライブラリの中で最も速いライブラリであることが証明されました。

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

DOMを簡単に操作する必要がある場合は jquery が依然として適切な選択であるか、単に型チェック以上のものが必要な場合は lodash または アンダースコア が良いかもしれません。 is.js の場合、構文は次のとおりです。

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

アンダースコアやlodashの_.isObject()のように、これはobjectsだけのものではありませんがarraysstringsにも当てはまります。

内部的には、このライブラリはObject.getOwnPropertyNamesに似たObject.keysを使用していますが、Object.getOwnPropertyNamesは、 here のように列挙可能で列挙不可能なプロパティを返すので、より徹底的です。

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

内部では、すべてのライブラリのすべての空のチェックメソッドがオブジェクトキーチェックロジックを使用しています。それを理解しやすくするための奇妙な方法です。あなたはそれをメソッドに入れることができます。Described here

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

2年間のプログラミングのあと、空のオブジェクトや配列が間違っていないとクリックすることは決してありませんでした。

入力がデフォルトでfalseの場合、または空のオブジェクトまたは配列の場合、これはtrueを返します。逆は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

この1行のコードは役に立ちます 

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、未定義、 ''、 ''、{}、[] などのすべての「空」をチェックする関数を1つ持つことができます。

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

純粋なVanilla 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

_ only _ {}を実際に受け入れるには、Lodashを使用してJavascriptでこれを実行する最善の方法は次のとおりです。

_.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

AJAX呼び出しに対して空のJSON応答を返していましたが、IE 8では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を使用しないという点で)。他の種類のオブジェクト(DOM要素、プリミティブな文字列/数値、Hostオブジェクト)では、ブラウザ間で一貫した結果が得られない可能性があるため、引数は常にプレーンなJavaScriptオブジェクトにしてください。オブジェクトが単純なJavaScriptオブジェクトかどうかを判断するには、$.isPlainObject()を使用します。

jQuery.isPlainObject({}) // true

jQuery.isPlainObject( "test" ) // false

Jquery api

0
chandu

オブジェクトにnull以外の値があるかどうかを確認するために、これが思いつきました。

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