配列が空または存在するかどうかを確認します


358

ページが初めて読み込まれるとき、画像があるかどうかを確認しimage_array、最後の画像を読み込む必要があります。

それ以外の場合は、プレビューボタンを無効にし、新しい画像ボタンを押して画像を配置する空の配列を作成するようユーザーに警告します。

問題は、あるimage_arrayelseのすべての時間の火災。配列が存在する場合-単にそれをオーバーライドしますが、アラートは機能しません。

if(image_array.length > 0)
    $('#images').append('<img src="'+image_array[image_array.length-1]+'" class="images" id="1" />');
else{
    $('#prev_image').attr('disabled', 'true');
    $('#next_image').attr('disabled', 'true');
    alert('Please get new image');
    var image_array = [];
}

更新HTMLをロードする前に、私はこのようなものを持っています:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>

コンソールログimage_array-何を取得しますか?
Utkanos、2012

var image_array = []がある場合の@Utkanos-// var image_array = []の場合は未定義(推奨)-実際の配列。
user1564141

array?.length-広くサポートされており、間もなくネイティブ機能になる予定です
Anbu Agarwal

回答:


517
if (typeof image_array !== 'undefined' && image_array.length > 0) {
    // the array is defined and has at least one element
}

暗黙のグローバル変数と変数の巻き上げが混在しているため、問題が発生している可能性があります。var変数を宣言するときは必ず使用してください:

<?php echo "var image_array = ".json_encode($images);?>
// add var  ^^^ here

そして、後でその変数を誤って再宣言しないようにしてください。

else {
    ...
    image_array = []; // no var here
}

33
いいえ。これは、image_arrayがnullのときに爆発します。マーフィーの法則はいつかはそうなると述べている。
Marco Faustinelli、

7
image_array.length十分ではありませんか?(指定なし>0
mcont

好奇心が強い:@JamesDrinkardの答えを使用して壊れるユースケースを見つけることができますか?
tsemer

12
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234 2016年

195

配列が空かどうかを確認するには

最新のES5 +:

if (Array.isArray(array) && array.length) {
    // array exists and is not empty
}

昔ながらの方法:

typeof array != "undefined"
    && array != null
    && array.length != null
    && array.length > 0

コンパクトな方法:

if (typeof array != "undefined" && array != null && array.length != null && array.length > 0) {
    // array exists and is not empty
}

CoffeeScriptの方法:

if array?.length > 0

どうして?

ケース未定義
未定義の変数は、まだ何も割り当てていない変数です。

let array = new Array();     // "array" !== "array"
typeof array == "undefined"; // => true

Case Null
一般的に、nullは値が不足している状態です。たとえば、一部のデータの取得に失敗したか失敗した場合、変数はnullです。

array = searchData();  // can't find anything
array == null;         // => true

配列で
ない Javascriptには動的型システムがあります。これは、変数が保持するオブジェクトのタイプを保証できないことを意味します。のインスタンスと通信していない可能性がありますArray

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case Empty Array
他のすべての可能性をテストしたので、今度はのインスタンスと話していますArray。それが空でないことを確認するために、それが保持している要素の数と、それが0を超える要素を持つことを確認します。

firstArray = [];
firstArray.length > 0;  // => false

secondArray = [1,2,3];
secondArray.length > 0; // => true

8
あることに注意してくださいではないだけをチェックするのに十分な(typeof array != "undefined" && array.length > 0)場合ので、arraynullがある、我々は得るでしょうしTypeError: Cannot read property 'length' of null
Pooyan Khosravi 2014年

||で&&を変更するかもしれません
Sahar Ch。

!(typeof array !== "undefined") || !(array.length > 0)?試してみただけで、同じエラーが発生しました。使用方法の完全な例を教えていただけます||か?
Pooyan Khosravi 2014年

私は意味(typeof array != "undefined" || array.length > 0)
サハルCHで。

説明をありがとう。(typeof array != "undefined" || array.length > 0)次のtrue場合に戻りますarray = null!(typeof array != "undefined" || array.length > 0)次のfalse場合に戻りますarray = [1,2]。理解できなくて申し訳ありませんが、@ Elsaは実際の例を提供できますか?前もって感謝します。
Pooyan Khosravi 2014年

70

どうですか(ECMA 5.1):

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}

1
.. && image_array.length)。私見では、あなたがしながら、できる安全に変換するには、JSのルーズタイピングに依存0する整数をfalseし、non-zero整数true、私は「あなたは何を意味するかと言う」ために、将来的には読みやすさのために、それは望ましいことを検討してください。私はそうするでしょう.. && image_array.length > 0)
ToolmakerSteve

28

これは私が使用するものです。最初の条件は、nullと未定義の両方を持つ真実をカバーします。2番目の条件は、空の配列をチェックします。

if(arrayName && arrayName.length > 0){
    //do something.
}

またはtsemerのコメントのおかげで、私は2番目のバージョンを追加しました

if(arrayName && arrayName.length)

次に、FirefoxのScratchpadを使用して、2番目の条件のテストを行いました。

var array1;
var array2 = [];
var array3 = ["one", "two", "three"];
var array4 = null;

console.log(array1);
console.log(array2);
console.log(array3);
console.log(array4);

if (array1 && array1.length) {
  console.log("array1! has a value!");
}

if (array2 && array2.length) {
  console.log("array2! has a value!");
}

if (array3 && array3.length) {
  console.log("array3! has a value!");
}

if (array4 && array4.length) {
  console.log("array4! has a value!");
}

それも証明しif(array2 && array2.length)if(array2 && array2.length > 0)まったく同じことをしています


13
これが最も簡潔であり、すべての例外問題をカバーしています。そして、あなたは真実が好きなので、if (arrayName && arrayName.length)
それでうまくいく

2
短くて速い!C#から来てif(obj)でnullをチェックするのに慣れるのにしばらく時間がかかりましたが、今では気に入っています:if(obj)// null check; if(array && array.length)//配列nullまたは空のチェック; if(array &&!array.length)//配列は存在しますが、チェックは空です; if(str)//文字列はnullでも空でもありません。唯一の落とし穴は、ゼロが有効な数値である場合、数値を使用しないことです。
Rick Love

1
(arrayName && arrayName.length)をしばらく使用していて、何か問題があるのではないかと心配になりました。:)
Koray

var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0Typescript にはニュアンスがあります。isNotEmptyのタイプはブール値ではなく、ブール値|未定義です。
Giedrius

15

あなたは使うべきです:

  if (image_array !== undefined && image_array.length > 0)

8

画像配列変数が定義されているかどうかをテストしたい場合は、次のようにすることができます

if(typeof image_array === 'undefined') {
    // it is not defined yet
} else if (image_array.length > 0) {
    // you have a greater than zero length array
}


@ user1564141 image_arrayが設定されているのに対して、関数が宣言されている場所がわかりにくい。ホスティングの問題が発生している可能性があるため、その変数をvar index_array = ...として宣言する必要がある場合があります。また、index_arrayを閉じるように設定するスクリプトタグです。スクリーンショットからは表示されません。
マイクブラント2012

他にもアラートがあり、配列が空の場合にのみ起動しますが、var image_arrayは毎回機能します...理由がわかりませんか?
user1564141

@ user1564141質問を更新してソースを出力として表示できると助かります。index-array宣言の場所を基準にして、if-elseロジックがソース内のどこに存在するのか、私にはまだ感じがありません。
マイクブラント

6

JavaScript

( typeof(myArray) !== 'undefined' && Array.isArray(myArray) && myArray.length > 0 )

ロダッシュとアンダースコア

( _.isArray(myArray) && myArray.length > 0 )

6

jQueryを使用してisEmptyObject()、配列に要素が含まれているかどうかを確認できます。

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

ソース:https : //api.jquery.com/jQuery.isEmptyObject/


動的に追加された要素(ajax)から、array.push()を使用して要素を追加するときに、これは私にとって唯一機能しました。ありがとう
TomoMiha 16

3

存在しない場合に例外を発生させず、ブール値に変換する簡単な方法:

!!array

例:

if (!!arr) {
  // array exists
}

3

これはどう ?未定義の配列の長さをチェックすると、例外がスローされる場合があります。

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}

ネストされたがif使用して回避することができ&&のように、image_array && image_array.lengthそれが短絡する場合はimage_array存在しません。
rvazquezglez 2018年

3

高評価の回答の一部は、jsfiddleに入れると「機能する」と確信していますが、動的に生成された配列リストがある場合、回答のこのコードの多くはMEでは機能しません。

これは私のために働いているものです。

var from = [];

if(typeof from[0] !== undefined) {
  //...
}

未定義の周りの引用符はなく、長さを気にしません。


1
2つのコメント:1)typeof文字列を返します。比較するundefinedと常に不安定です2)fromが定義されているかどうかを確認しません。そうでない場合、上のコードはエラーをスローします
Xeltor

@Xeltorいいえ、ありません。これを証明するため、またはコメントを削除するために、jsfiddleまたはplunkerを提供してください。
Tom Stickel

@Xeltor、見ているだけで、あなたの答えは-2で、BOLDであなたが間違っていると言っている人々とのコメントがぎっしり詰まっているようです。
トムスティッケル

3

オプションの連鎖

オプションのチェーン提案がステージ4に達し、より幅広いサポートを得ているため、これを行う非常にエレガントな方法があります。

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

私はJavaScriptでこの問題にかなり遭遇します。私にとって最良の方法は、長さをチェックする前に非常に広範なチェックを行うことです。このQ&Aで他のいくつかの解決策を見ましたが、いずれかnullundefinedまたはその他の偽の値をチェックできるようにしたいと思いました。

if(!array || array.length == 0){
    console.log("Array is either empty or does not exist")
}

これundefinedによりnull、最初に、、、またはその他の偽の値がチェックされます。これらのいずれかがtrueの場合、これはなので、ブール値を完成させORます。次に、array.length配列が未定義の場合にエラーになる可能性のある、より危険なのチェックをチェックできます。場合、これが到達することはありませんarrayであるundefinednull、その条件の順序は非常に重要です。



1

以下は、関数にラップされた私のソリューションであり、エラーをスローして、オブジェクトスコープと、関数に渡されるすべてのタイプの可能なデータ型に関するいくつかの問題を管理します。

これがこの問題を調べるために使用した私のフィドルです(ソース

var jill = [0];
var jack;
//"Uncaught ReferenceError: jack is not defined"

//if (typeof jack === 'undefined' || jack === null) {
//if (jack) {
//if (jack in window) {
//if (window.hasOwnP=roperty('jack')){
//if (jack in window){

function isemptyArray (arraynamed){
    //cam also check argument length
  if (arguments.length === 0) { 
    throw "No argument supplied";
  }

  //console.log(arguments.length, "number of arguments found");
  if (typeof arraynamed !== "undefined" && arraynamed !== null) {
      //console.log("found arraynamed has a value");
      if ((arraynamed instanceof Array) === true){
        //console.log("I'm an array");
        if (arraynamed.length === 0) {
            //console.log ("I'm empty");
            return true;
        } else {
          return false;
        }//end length check
      } else {
        //bad type
        throw "Argument is not an array";
      } //end type check
  } else {
    //bad argument
    throw "Argument is invalid, check initialization";;
  }//end argument check
}

try {
  console.log(isemptyArray(jill));
} catch (e) {
    console.log ("error caught:",e);
}

0

配列として宣言された変数がない場合は、チェックを作成できます。

if(x && x.constructor==Array && x.length){
   console.log("is array and filed");
}else{
    var x= [];
    console.log('x = empty array');
}

これは、変数xが存在するかどうかをチェックし、存在する場合は、それが塗りつぶされた配列であるかどうかをチェックします。それ以外の場合は、空の配列を作成します(または他のことを実行できます)。

配列変数が作成されていることが確かな場合は、簡単なチェックがあります。

var x = [];

if(!x.length){
    console.log('empty');
} else {
    console.log('full');
}

あなたは確認することができますここに私のバイオリンを示した配列を確認するための最も可能性のある方法で。


0

あなたはこれを行うべきです

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }


-1

tsで

 isArray(obj: any) 
{
    return Array.isArray(obj)
  }

HTMLで

(写真==未定義||!(isArray(photos)&& photos.length> 0))


3
よろしいですか?結局、2番目の部分はHTMLのようには見えません
Nico Haase

-3

image_arrayを作成すると、空になるため、image_array.lengthは0になります。

以下のコメントで述べたように、私はこの質問の回答に基づいて私の回答を編集し ます):

var image_array = []

else括弧内では、コードで以前に定義されたimage_arrayは何も変更されません。


私はそれをソースに持っています、ページをロードするとき...投稿するのを忘れてください。
user1564141

私の答えに間違っている可能性があるものを追加したいので、ここに述べます。一般的な言語では、ブロックの内部で作成されたものは、ブロックの「外部」には表示されません。[]var image_array = []elseブロックの内側で定義すると、外側から見えるかどうかわかりません。試してみるimage_array = []
Al_th

しかし、他からimage_arrayを削除すると、すべてがうまく機能します。
user1564141
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.