配列が空またはnullかどうかを確認する


106

jQueryで配列が空かnullかどうかを確認する方法を教えてください。試しましたarray.length === 0がうまくいきませんでした。エラーも発生しませんでした。

これはコードです:

var album_text = new Array();

$("input[name='album_text[]']").each(function(){
  if( $(this).val() &&  $(this).val() != '') {
    album_text.push($(this).val());
  }
});
if (album_text.length === 0) {
  $('#error_message').html("Error");
}

else {
  // send data
}


1
@Julien、このスレッドを開始する前に、そのスレッドにリストされているすべての解決策を試しました。それらのどれも何とか働いた。
入力

コンテキスト用のコードをもう少し取得できますか?JavaScript、HTMLを囲んでいますか?それ$("input[name='album_text[]']")が実際に要素を返していると確信していますか?
ジョンアダムス

@JulienSchmidt:リンクした質問は、配列全体ではなく、配列のが空かどうかを確認することです。
Dan Dascalescu 2017年

回答:


168

セレクターが実際に機能している限り、配列の長さをチェックするコードに問題はありません。それはあなたが望むことをするはずです。コードをクリーンアップしてよりシンプルで読みやすくする方法はたくさんあります。これは私がクリーンアップしたものについてのメモ付きのクリーンアップされたバージョンです。

var album_text = [];

$("input[name='album_text[]']").each(function() {
    var value = $(this).val();
    if (value) {
        album_text.push(value);
    }
});
if (album_text.length === 0) {
    $('#error_message').html("Error");
}

else {
  //send data
}

あなたが何をしていたか、そして私が何を変えたかについてのいくつかのメモ。

  1. $(this)は常に有効なjQueryオブジェクトなので、確認する必要はありませんif ($(this))。DOMオブジェクトが含まれていない$(this).length場合もありますが、必要に応じて確認できます.each()が、アイテムがない場合はループが実行されないため$(this).each()ループ内は常に何かになるため、ここでは必要ありません。
  2. 同じ関数で$(this)を複数回使用することは非効率的です。一度ローカル変数に入れて、そのローカル変数から使用する方がはるかに良いです。
  3. []ではなくで配列を初期化することをお勧めしますnew Array()
  4. if (value)値が文字列であることが期待される場合はvalue == null、両方から保護されるためvalue == undefinedvalue == ""そうする必要はありませんif (value && (value != ""))。あなたはただ行うことができます:if (value)3つの空の条件すべてをチェックする。
  5. if (album_text.length === 0) 有効な初期化された配列(ここにある)である限り、配列が空かどうかがわかります。

このセレクターで何をしようとしてい$("input[name='album_text[]']")ますか?


5
@MaciekSemikは-を参照stackoverflow.com/questions/359494/...を===特に型変換を許可しない限り、常に厳密な等価()を使用します。入るのは良い習慣です。
jfriend00 14

73

ユーザーJQueryはEmptyObjectで、配列に要素が含まれているかどうかを確認します。

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true

2
特に変数がオブジェクトでもある場合は、長さをチェックするよりもはるかに信頼性が高くなります(オブジェクトの場合、長さは空かどうかのチェックには機能しません)。
精力的な2014年

これは私の意見ではより適切な答えです。
Earl3s 2015年

4
isEmptyObject拡張されているfalse場合Array.prototypeは常に返されます(例:Array.prototype.someFunction = function () {};配列が空の場合でも)。一部のフレームワーク(Ember.jsなど)は、デフォルトでArrayプロトタイプを拡張します。
jesenko、2015年

4
isEmptyObject!jQuery 1.8.3の場合jQuery.isEmptyObject([])は戻り値falseに注意してください。jQuery1.11.3の場合は戻りますtrue。実際、jQueryのドキュメントで、他のタイプのオブジェクト(DOM要素、プリミティブ文字列/数値、ホストオブジェクト)がブラウザ間で一貫した結果を提供しない可能性があるため、引数は常にプレーンJavaScriptオブジェクトである必要があります。@rhinoxiの回答は見つかりませんでした。
Dmitry Vershinin

8

''配列にプッシュする前に(空の文字列)を確認する必要があります。配列に空の文字列の要素があります。その後、あなたalbum_text.length === 0はうまくいきます。


更新されたコードをご覧ください。このコードを追加しましたが、if( $(this).val() && $(this).val() != '') 機能しません。
入力

8

@jesenkoが述べたように、jqueryの$ .isEmptyObjectを使用して配列が空かどうかを確認するのは危険だと思います。私はちょうどその問題に会った。

isEmptyObjectドキュメント、それは言及します:

引数は常にプレーンJavaScriptオブジェクトである必要があります

これは、で判断できます$.isPlainObject。の戻り値$.isPlainObject([])はfalseです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.