特定の配列インデックスに値が存在するかどうかをJavaScriptでチェックインするにはどうすればよいですか?


521

これは、「インデックス」の位置にある値が存在するかどうかをテストするために機能しますか、それともより良い方法がありますか?

if(arrayName[index]==""){
     // do stuff
}

6
配列全体が空であるかどうかをチェックしたくないことに注意してください。 "index"のインデックス値を持つ特定の場所のみ
Ankur

「特定の配列インデックスに値が存在する場合、JavaScriptをチェックインするにはどうすればよいですか」と言うことで、タイトルを改善できます。
demisx 2017

回答:


738

概念的には、JavaScriptの配列にはからまでのarray.length要素が含まれます。インデックス付きの配列要素は、との間にある場合、配列の一部として定義されます。iがこの範囲にない場合、配列にはありません。array[0]array[array.length - 1]ii0array.length - 1

つまり、概念的には、配列は線形であり、ゼロから始まり、最大値に達します。エントリが存在しないその範囲内に「ギャップ」を持つメカニズムはありません。特定の位置インデックス(indexは0または正の整数)に値が存在するかどうかを調べるには、文字通り単に

if (i >= 0 && i < array.length) {
  // it is in array
}

動的言語ではあまり意味がなく、特定のコードでは非効率的であるため、現在、内部ではJavaScriptエンジンは配列スペースをこのように直線的かつ連続的に割り当てません。それらはおそらくハッシュテーブルまたは戦略のハイブリッド混合であり、配列の未定義の範囲にはおそらく独自のメモリが割り当てられていません。それにもかかわらず、JavaScriptは言語は現在の配列に望んでいるarray.length n個持つものとしてのnメンバーと彼らの名前は0N - 1、およびこの範囲内のものがアレイの一部です。

ただし、おそらく必要なのは、配列内の値が実際に定義されたものであるかどうかを知ることですundefined。つまり、そうではありません。たぶん、あなたも、それが定義されていますかどうかを知りたいではありませんnull。値を設定せずにメンバーを配列に追加することは可能です。たとえば、array.lengthプロパティを増やして配列値を追加すると、新しい値はすべてになりますundefined

指定された値が意味のあるものであるか、定義されているかを判断するため。つまり、ではない undefined、またはnull

if (typeof array[index] !== 'undefined') {

または

if (typeof array[index] !== 'undefined' && array[index] !== null) {

興味深いことに、JavaScriptの比較ルールにより、最後の例は次のように最適化できます。

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
OPがどのような配列を扱っているかをOPが知っている可能性は非常に高くなりますが、完全を期すためです。通常、配列のようなオブジェクトにはlengthプロパティも含まれます。この場合、後の2つの例の方が適切です。
ジャスティンジョンソン

9
いつでも交換することができますfoo !== 'undefined' && foo !== nullだけでfoo != null
thinklinux

1
@TheComposer言語によると、Javascriptの配列のサイズはarray.lengthによって定義され、配列はから0までのすべての要素で構成されると言われていますarray.length - 1。ただし、これらの値のすべてが定義済みの値であるとは限りません。配列メンバーでdeleteキーワードを使用すると、そのメンバーは未定義に設定されます。array.lengthパラメーターを増分して配列を拡張する場合と同様に、新しい値は未定義として開始されます。実際には、JavaScript実装はおそらく配列のストレージを最適化し、未定義の値の一部またはすべてがメモリを占有しない場合があります。
thomasrutter 2014

1
array.lengthは何も繰り返さず、ただ1つの数値です。
thomasrutter 2017年

1
この回答では、配列のインデックスが設定されていない場合は対象外です。 new Array(1)[0] === undefinedしかし、値は空です。 [undefined][0] === undefinedしかし、値は設定されています。配列は値あります。唯一の完璧な答えは、使用しているinhasOwnProperty()- idx in arrayあるいはarray.hasOwnProperty(idx)この答え--per:stackoverflow.com/a/39171620/3120446
dx_over_dt

350

これを行うことはできませんか?

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
問題は、配列の特定のインデックスが存在するかどうかをテストする方法に関するものでした。
thomasrutter 14

26
思いif(arrayName.length) {...違いを作りますか?
siannone 2015年

10
なぜそれほど多くの賛成票があるのですか?これは明らかに質問に答えません。
algiogia

10
if(arrayName.length) {...失敗したnull
ロニー・ロイストン

5
これは、で失敗[undefined, undefined]長さ= 2を持つ配列である
Soldeplata Saketos

41

のみを使用するの.lengthは安全ではなく、一部のブラウザではエラーが発生します。これはより良い解決策です:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

または、以下を使用できます。

Object.keys(__array__).length

2
«注意してください。配列全体が空であるかどうかをチェックする必要はありません。 "index"のインデックス値を持つ特定の場所だけです»
Oriol

アレイ全体をチェックしたい人のための素晴らしく、短くてシンプルな答え
Luis Martins

23
if(!arrayName[index]){
     // do stuff
}

8
配列の値が存在するが0で、nullの場合、これはまた、など、「」、ものを行うだろう
thomasrutter

トーマスは正しいです。ただし、これは多くの場合に十分です(おそらく列挙する必要があります)。
Justin Johnson、

最も簡単な方法
ブレーカー

8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter定義されていない配列要素になる可能性がある方法を思い付きません。
Rex M

うーん、(myarray [1] = undefinedvariable)は機能しますか?または単に(myarray [1] = undefined)?
thomasrutter 2010

@thomasrutter両方とも例外をスローしますよね?(undefinedvariable is undefined)
Rex M

1
Firebugなどを使用して、自分でテストできます。JavaScriptでは、未定義の変数の値を読み取っても例外はスローされません-未定義の値が返されます。
thomasrutter 2010

@thomasrutter最初のコメントが間違っている。x == nullnullまたは未定義の場合にのみ真になります。同様に、x != nullnullでも未定義でもないものすべてに当てはまります。特に未定義のものを探す必要がない限り、暗黙の変換の良さに頼ってください。
Marcus Stade

8

短く普遍的なアプローチ

偽の値(false、未定義、null、空の文字列など)がある配列をチェックする場合は、次のように使用できます。 every()メソッドを。

array.every(function(element) {return !!element;}); // returns true or false

例えば:

['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true

偽の値の最初のインデックスを取得する必要がある場合は、次のように実行できます。

let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

特定のインデックスについて配列の偽の値を確認する必要があるだけの場合は、次のように実行できます。

if (!!array[index]) {
  // array[index] is a correct value
}
else {
  // array[index] is a falsy value
}

6
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

「Null」を意味する場合->その要素はnullまたは ''に等しい場合、この場合:すべての「null」要素をフィルタリングした後、配列が空かどうかを確認します

if(!arr.clean().length){return 'is null'}

もちろん、 前にCleanメソッドを追加します。

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

5

次のような関数を作成することをお勧めします。

function isEmptyEl(array, i) {
   return !(array[i]);
}

次のように呼び出すことができます。

if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

開発者にisEmptyElインターフェースを順守させると、未定義のarrayNameやindexVal変数などの入力エラーをキャッチできます。

(JavaScriptでプログラミングする場合は、防御的にプログラミングするのが一般的には良い習慣です。)

arrayNameが定義されていないと、次のようなエラーがスローされます。

Uncaught ReferenceError: arrayName is not defined
    at <anonymous>:2:15
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

未定義のindexValの同様の結果。

配列またはインデックスの値が存在しない場合、エラーが発生します。

有効な入力の場合、arrayName [indexVal]が次のいずれかである場合にのみtrueを取得します。

  • ヌル
  • 未定義
  • NaN
  • 空の文字列
  • 0

5

それはあなたが「空」で何を意味するかによる。

その名前のプロパティがないオブジェクトのプロパティの値を取得しようとすると、値が取得されます undefined

これがスパース配列で起こります。すべてのインデックスがその間0array.length-1存在するわけではありません。

だからあなたはどうかを確認することができますarray[index] === undefined

ただし、プロパティindexundefined値とともに存在する可能性があります。あなたがこのケースをフィルタリングしたい場合は、使用することができin、オペレータのかhasOwnPropertyで説明したように、オブジェクトはJavaScriptでプロパティを持っている場合、私がチェックする方法は?

index in array;
array.hasOwnProperty(index);

undefinedor null値を持つ既存のプロパティが存在しないと見なしたい場合は、緩やかな比較array[index] == undefinedまたはを使用できますarray[index] == null

あなたは、配列がスパースでないことを知っている場合は、比較可能性indexarray.length。ただし、安全のために、index本当に配列インデックスであることを確認したい場合があります。プロパティ名が配列インデックスかどうか確認するをご覧ください。


2
これは、未設定の配列項目(値を持たない)と未定義の値に設定されている項目を適切に区別する唯一の回答です。2つの状態は、未設定の配列項目にアクセスすると未定義が返されるという事実によって不明瞭になりますが、それらは異なります。
olivr 2016年

未設定の値(未定義またはnullとは異なる)の可能性がある配列がある場合は、hasOwnPropertyを使用します。
CMCDragonkai 2018年

1

OK、我々は以下のような配列を持っているのであれば、のは、最初の配列の値をJavaScriptで存在していない場合でしょうが、何が起こるか見てみましょう:

const arr = [1, 2, 3, 4, 5];

次に、インデックス5に6があるかどうかを確認します。

arr[5];

そして私たちは undefined...

つまり、基本的にはそれが答え、未定義かどうかを確認する最良の方法なので、次のようになります。

if("undefined" === typeof arrayName[index]) {
  //array value is not there...
}

この場合は、これを行わない方がよいでしょう。

if(!arrayName[index]) {
  //Don't check like this..
}

この配列があると想像してください。

const arr = [0, 1, 2];

そして私たちはします:

if(!arr[0]) {
  //This get passed, because in JavaScript 0 is falsy
}

ご覧のとおり、0があっても認識されません。同じことを実行してアプリケーションをバグのあるものにすることができる他のものがいくつかあるので、注意してください。

  1. undefined:値が定義されておらず、undefined
  2. null:nullの場合、たとえばDOM要素が存在しない場合...
  3. 空の文字列''
  4. 0:数値ゼロ
  5. NaN:数値ではありません

1

いくつか見落としているように思われる点を指摘したいと思います。つまり、配列の中央に「空の」配列位置がある可能性があります。以下を検討してください。

let arr = [0, 1, 2, 3, 4, 5]

delete arr[3]

console.log(arr)      // [0, 1, 2, empty, 4, 5]

console.log(arr[3])   // undefined

チェックする自然な方法は、配列メンバーが未定義かどうかを確認することです。他の方法が存在するかどうかはわかりません

if (arr[index] === undefined) {
  // member does not exist
}

0

array [index]がnullの場合はこれを試してください

if (array[index] != null) 

0

Lodashを使用すると、次のことができます。

if(_.has(req,'documents')){
      if (req.documents.length)
      _.forEach(req.documents, function(document){
        records.push(document);
      });
} else {
}

if(_.has(req,'documents'))リクエストオブジェクトにという名前のプロパティがあるかどうかを確認し、そのプロパティがあるdocuments場合は、次にif (req.documents.length)それが空の配列でないかどうかを検証して、他の処理をforEach続行できます。


0

定義されていないか、削除されているかを確認するには:

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

連想配列や、インデックスを削除した配列でも機能します

定義されていないか、削除されたか、またはnullまたは論理的な空の値(NaN、空の文字列、false)であるかどうかを確認するには:

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}

0

私はlaravelデータテーブルを使用してこの問題に遭遇しました。呼び出さpropertiesれたJSON値をアクティビティログに格納していて、この値が空かどうかに基づいてボタンを表示したいと考えていました。

まあ、それが空の場合、データテーブルはこれを配列として解釈し、そうでない場合はオブジェクトとして解釈していたため、次の解決策が私にとってうまくいきました:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

オブジェクトには長さのプロパティがありません。


0

この決定は、命令型OOPや手続き型よりも宣言型関数型プログラミングを好む人に適していると思います。内部に値がありますか?(真または偽の値)」という質問の場合、.someメソッドを使用して内部の値を検証できます。

[].some(el => el || !el);
  • 完璧ではありませんが、などの同じロジックを含む追加の関数を適用する必要はありませんfunction isEmpty(arr) { ... }
  • それでも「長さはゼロですか?」よりも良い音がします。私たちがこれを行うとき、[].length結果として得をし0ているいくつかのケースでは危険です。
  • あるいは、この[].length > 0格言は、「ゼロよりその長さの大きいですか?」

高度な例:

[    ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true

-1

Loadshライブラリを使用すると、次のようにこれをより効率的に行うことができます。

たとえば、「pets」という名前の配列がある場合:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });

すべての配列値でnullまたは未定義の値をチェックするには、

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

http://underscorejs.org/で他の例を確認してください


fn(){}は構文エラーであり、これが特定のインデックスに配列項目が存在するかどうかを確認するのにどのように役立つかは、はっきりしていません。
Oriol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.