2016-10-07 8 views
1

私はそれぞれのプロパティが配列であるオブジェクトを渡す必要があります。この関数は各配列に保持されている情報を使用しますが、配列全体が空であるかnullであるかを調べることによって、オブジェクト全体が空であるかどうか(プロパティを持たないことだけではない)を調べたいと思います。私はこれまで持っている:オブジェクトの配列がすべて空であるかどうかをチェックする方法?

function isUnPopulatedObject(obj) { // checks if any of the object's values are falsy 
    if (!obj) { 
     return true; 
    } 

    for (var i = 0; i < obj.length; i++) { 
     console.log(obj[i]); 
     if (obj[i].length != 0) { 
      return false; 
     }  
    } 

    return true; 
} 

したがって、たとえば、これは上記のfalseことにつながる:

obj { 
    0: Array[0] 
    1: Array[1] 
    2: Array[0] 
} 

これは私が(そう真である)をチェックしています空ですが:

obj { 
    0: Array[0] 
    1: Array[0] 
    2: Array[0] 
} 

上記のコードは機能しません。前もって感謝します。

答えて

4

を使用するを使用してみてくださいそのオブジェクトが小切手を渡すと、Object.keysとアレイ#そうのような余分なevery

var allEmpty = Object.keys(obj).every(function(key){ 
return obj[key].length === 0 
}) 

このたびは、私たちがobj[key].length === 0 trueを返しますか与えられたチェックを実行する場合に応じて、ブール値(真/偽)にallEmptyを設定します。

このオブジェクトがtrueにallEmptyを設定します。

var obj = { 
    0: [], 
    1: [], 
    2: [] 
} 

これはfalseに設定しながら:

var obj = { 
    0: [], 
    1: [], 
    2: [], 
    3: [1] 
} 
+0

ありがとう!そのような解決策では、オブジェクトが配列のような長さを持たないことを認識しませんでした。 – LaLaLottie

1

オブジェクトにはlengthプロパティがないので機能しません。

は、この単純な1

function isUnPopulatedObject(obj) { 
    return Object.keys(obj).filter(function(key){ 
     return obj[ key ].length > 0; //if any array has a property then filter will return this key. 
    }).length == 0; //used == here since you want to check if all are empty 
} 

またはevery

function isUnPopulatedObject(obj) { 
    return Object.keys(obj).every(function(key){ 
     return obj[ key ].length == 0; 
    }); 
} 

か、我々は、オブジェクトを通過している場合のすべてのキーを見つけたいのであればsome

function isUnPopulatedObject(obj) { 
    return Object.keys(obj).some(function(key){ 
     return obj[ key ].length > 0; 
    }) === false; 
} 
+0

の最新バージョンでのみ動作するはずです、あなたが使用する必要があります '.every()'や '。some() 'を呼び出すことで、新しい配列を組み込むのではなく、可能な限り早く終了させることができます。あなたが使用しているのは、jQueryの欠点の一般的な回避策です。 –

+0

フィルタリングの代わりに '.some()'を使います。中間配列は作成されません。 – 4castle

+0

@squint「every」がより良く見える – gurvinder372

2

objectがlengthプロパティを持っていません。オブジェクトの値をループするにはいくつかの方法がありますが、その場合はfindにする必要があります。

値が配列かどうかを確認するには、Array.isArrayを使用できます。例えば

function objectIsEmpty(obj) { 
 
    return Object.keys(obj).every(function(key) { 
 
     var val = obj[key]; 
 
     
 
     if (Array.isArray(val) && val.length === 0) { 
 
     return true; 
 
     } 
 
     
 
     // Other rules go here: 
 
     // ... 
 
     
 
     return false; 
 
    }); 
 
}; 
 

 

 
console.log(objectIsEmpty({ 0: [], 1: [], 2: [] })); 
 
console.log(objectIsEmpty({ 0: [], 1: [1], 2: [] }));

+1

ありがとうございました。 – LaLaLottie

1

町の新しい子供の使用を開始することも面白いかもしれません。 Object.values()

var o1 = {0: [], 1: [1], 2: []}, 
    o2 = {0: [], 1: [], 2: []}, 
chkObj = o => Object.values(o).every(a => a.length === 0); 
console.log(chkObj(o1)); 
console.log(chkObj(o2)); 

注:これは、ブール値の結果を使ってChrome、オペラ座、FF

+0

ありがとうございました。 – LaLaLottie

関連する問題