1. ホーム
  2. javascript

[解決済み] 配列が空であるか、存在しないかを確認する方法は?[重複している]

2022-03-16 11:39:28

質問

配列が空であるか、存在しないかを確認する最も良い方法は何ですか?

こんな感じ?

if(array.length < 1 || array == undefined){
    //empty
}

解決方法は?

のチェックを行いたい。 undefined を先にします。逆にすると、配列が未定義の場合にエラーが発生します。

if (array === undefined || array.length == 0) {
    // array empty or does not exist
}

更新情報

この回答はかなり注目されているので、私が最初に書いた回答は、何よりも問題で評価される条件の順番が間違っていることを指摘したいと思います。この意味で、次のようないくつかのシナリオに対処できていません。 null 値、他のタイプのオブジェクトに length プロパティなど。また、あまりイディオム的なJavaScriptとは言えません。

フールプルーフアプローチ
コメントからヒントを得て、私が現在考えている、配列が空か存在しないかをチェックするフールプルーフな方法を以下に示します。また、変数が配列を参照しているのではなく、他のタイプのオブジェクトを参照している可能性も考慮に入れています。 length プロパティがあります。

if (!Array.isArray(array) || !array.length) {
  // array does not exist, is not an array, or is empty
  // ⇒ do not attempt to process array
}

分解してみると

  1. Array.isArray() は、当然のことながら、引数が配列であるかどうかをチェックします。これは、以下のような値を除外します。 null , undefined と、配列でないものはすべて
    なお、これによって 配列のようなオブジェクト のような arguments オブジェクトと DOM NodeList オブジェクトを作成します。あなたの状況によっては、これはあなたが求めている動作ではないかもしれません。

  2. array.length 条件は、変数の length プロパティが 真実味のある の値を指定します。前の条件によって、私たちが実際に配列を扱っていることが既に確立されているので、より厳密な比較は、例えば array.length != 0 または array.length !== 0 は必要ありません。

プラグマティック・アプローチ
多くの場合、上記はやりすぎだと思われるかもしれません。TypeScriptのような高次の言語を使っていて、コンパイル時に型チェックのほとんどをやってくれるとか、オブジェクトが実際に配列なのか、単に配列っぽいだけなのかは気にならないとか。

そういう場合は、次のような、よりイディオムなJavaScriptを選ぶことが多いですね。

if (!array || !array.length) {
    // array or array.length are falsy
    // ⇒ do not attempt to process array
}

あるいは、その逆もよくあります。

if (array && array.length) {
    // array and array.length are truthy
    // ⇒ probably OK to process array
}

の導入に伴い オプションのチェーニング演算子 (エルビス演算子)をECMAScript2020で採用することで、さらに短縮することができます。

if (!array?.length) {
    // array or array.length are falsy
    // ⇒ do not attempt to process array
}

あるいはその逆。

if (array?.length) {
    // array and array.length are truthy
    // ⇒ probably OK to process array
}