2017-03-07 24 views
0

nullの2つの配列myArray1とmyArray2がある場合、どのように出力するかは、1つの配列は空ではありませんか?Javascript:少なくとも1つの空でない配列のテスト(配列の1つがnullの場合)

myArray1 = ["one", "two", "three"]; //-> non-empty array 
    myArray2 = null; //-> not an array (in my case this happens from .match() returning no results) 

私が表現したい、myArray1 && myArray2はFALSEになりますが、myArray1 || myArray2がTRUEになるような:私は次の変数を持っていると仮定すると

私は他の関連するスタックオーバーフローの質問(下記の要約リストを参照)を見ましたが、解決策を見つけるのにまだ苦労していたので、回答が別の質問として投稿すると思いました。

空の配列を試験する一般的な方法は次のとおりです。

myBooleanOr = (myArray1.length || myArray2.length); //3 
    myBooleanAnd = (myArray1.length && myArray2.length); //Error 

両方の変数が配列されているが、この場合には、二つ目は、エラーをスローします場合は、この作品:「のプロパティの長さを読み取ることができませんnull '以下も同じエラーをスローしますので、Boolean()機能を使用すると、問題が解決しない:

myBooleanAnd = (Boolean(myArray1.length) && Boolean(myArray2.length)); //error 

いくつかのスタックオーバーフローの質問に受け入れられた空の配列をテストするためのソリューションはtypeof myArray !== "undefined"を使用することですが、それはまだありません配列のどちらも"undefined"と一致しているためmyBooleanAndはまだエラーアップスローされますので、問題を解決:

var bool = (typeof myArray1 !== "undefined"); //true 
    var bool = (typeof myArray2 !== "undefined"); //true 
    var myBooleanAnd = ((typeof myArray1 !== "undefined" && myArray1.length) || (typeof myArray2 !== "undefined" && myArray2.length)); //Error: cannot read property length of null 

もまた、動作しない、直感的なようだ[]、反対の配列を比較し、配列のどちら理由一致[]

var bool = (myArray1 !== []); //true 
    var bool = (myArray2 !== []); //true 

その他の関連記事

を含む空のJavaScript配列のためのテストとスタックオーバーフローの契約上の他の質問の数:空の配列のための

およびJavaScriptでの空の配列の真理値についての質問もあります

は、

更新

元の質問に記載されている以下のエラーを修正しました(指摘した人のおかげ)。他の人にも役立つかもしれないので、ここにリストしています:

  • ==! typeof x === "undefined"
+0

はJavaScriptには、 '==!'演算子はありません。あなたが探している演算子は '!=='です。 – JLRishe

+0

@JLRhehe hm私はそれについて疑問を抱いていましたが、私はそれらの両方をテストしましたが、どちらも機能します...それは「ベストプラクティス」の問題なのでしょうか? – ATJ

+1

いいえ、どちらもありません。 '==!'は '==! 'の不十分な間隔に相当します。つまり' 1 ==!' a''→ '1 == false'→' false'です。あなたが '==!'をどこでも使っているなら、あなたのコードの多くがあなたの期待とは異なる行動をとると思います。 – JLRishe

答えて

2

1つの配列が空でないかどうかを判断するためにヘルパー関数を使用し、それを2回使用することをお勧めします。

function isNonEmptyArray(arr) { 
    return !!(Array.isArray(arr) && arr.length); 
} 

var myBooleanAnd = isNonEmptyArray(myArray1) && isNonEmptyArray(myArray2); 
var myBooleanOr = isNonEmptyArray(myArray1) || isNonEmptyArray(myArray2); 
+0

'!!'はタイプミスか、 '!'とは何か違うのですか? ( 'return'キーワードの後ろの括弧の前に) – ATJ

+1

' !! 'は真実か偽かをtrueまたはfalseに強制します。例えば'!!" hello "'→ 'true'。タイプミスではありません。 – JLRishe

+0

'Boolean()'関数と同等ですか? – ATJ

0

一つの解決策に変更、!==

  • typeof演算X === undefinedにある変更(またはBoolean()なし)以下:

    Array.isArray()とArray.lengthとを使用して:

    var myBooleanAnd = Boolean(Array.isArray(myArray2) && myArray2.length) && Boolean(Array.isArray(myArray1) && myArray1.length) ; //false -> OK 
        var myBooleanOr = Boolean(Array.isArray(myArray2) && myArray2.length) || Boolean(Array.isArray(myArray1) && myArray1.length) ; //true -> OK 
    

    0123の代わりにmyArray1 !== nullを使用することも可能ですがありますが、後者はより具体的なテストなので、より広範なArray.isArray()メソッドが望ましいと思われます。

    UPDATE

    私は以前、以下のものを使用して提案していた:、

    var myBooleanAnd = Boolean(myArray1 && myArray2); //returns false -> OK 
        var myBooleanOr = Boolean(myArray1 || myArray2); //returns true -> OK 
    

    しかし@JLRisheで指摘したように、次の式もTRUEを返し、以来、これは安全なソリューションではありませんなぜなら配列が決して空ではない状況でのみ機能するからです。

    var bool = Boolean([] && []); //returns true -> false positive 
    
  • +0

    #1は、目標を達成できません。配列か、空でないかはチェックしません。 – JLRishe

    +0

    @JLRishe少なくとも1つの配列に値が含まれている場合、TRUEを取得する方法について質問します。 #1はそれをします...私はあなたのポイントを逃していますか? – ATJ

    +1

    空の配列が2つある場合はtrueを返します。それは偽陽性であり、それが必要な目的に役立たないということです。 – JLRishe

    0

    アレイのテストは十分に簡単です:「myarrayのは」は、少なくとも一つのアイテムを持つ配列、または成立しない場合には、少なくとも持つ配列であれば

    var blnIsPopulatedArray = (myArray != null 
              && typeof myArray == "object" 
              && typeof myArray.length == "number" 
              && myArray.length > 0); 
    

    はfalseを返します。一品。

    +1

    (typeof null == "object")はtrueを返します。したがって、 "object"に対するテストはmyArray2を除外しません。 test typeof myArray2.lengthは次のエラーを返します:nullのプロパティの長さを読み取ることができません... – ATJ

    +0

    @ATJ、なぜ私も長さをテストしています、myArrayがnullの場合、長さは有効ではありません。 – SPlatten

    1

    オクラホマので、サンプルコード中のエラーの束がそこにいる、私はそれらすべてを説明することにしようとするでしょう:これは単純明快である

    ここ

    myBooleanOr = (myArray1.length || myArray2.length); //3
    myBooleanAnd = (myArray1.length && myArray2.length); //Error

    、最初にlineは遭遇した最初の真理値を返します。 myArray1length > 0であるため、その値を返し、条件の2番目の部分を評価しないため、エラーが発生しません。チェックを入れ替えると破損します。
    2つ目の行は2つの値を組み合わせて結果を与えます。したがって、2つの変数のいずれかがnullの場合、常にエラーが発生します。あなたは、それは常にfalseとなりますundefined定数と比較する場合

    var bool = (typeof myArray1 === undefined); //false

    typeof演算は、文字列を返し、ポストのほとんどに書かれたように正しい文はtypeof myArray1 === "undefined"であるあなたは、「厳密に

    var bool = (myArray2 ==! null);

    をリンク等しくない」オペレータは!==であり、==!ではありません。あなたは別の操作をしているので、という驚くべき結果が得られます。結果構文に右のスペースを置く

    、これはあなたのコードであるvar bool = (myArray2 == !null);

    だから、本当の取得、本質的にfalsyあるnullの値を、ブールフリップ、その後、myArray2がに緩く、等しい場合を比較true ... myArray2nullなので、私たちが言ったようにそれは間違っています。比較はfalseを返します。


    は、質問に対する解決策のために、私は理解するより、明示的に明らかである少し長めの構文を提案するだろう、とあなたはより多くの複雑さを加えることなく、あなたが好きどのように多くのアレイをチェックするために拡張することができ、言いました:

    var myArray1 = [1,2,3] 
     
    var myArray2 = null 
     
    
     
    var arrays = [myArray1, myArray2] 
     
    
     
    var oneNotEmpty = arrays.some(a => typeof a != "undefined" && a != null && a.length > 0) 
     
    
     
    console.log("At least one array non-empty?", oneNotEmpty)

    0

    あなたは、配列かではない何かを確認するためにisArrayを使用することができます。最新のブラウザーのほとんどがそれをサポートしています。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

    そして、isArrayと配列の長さを組み合わせて、何かが有効でない空の配列であるかどうかを確認することができます。

    function isOneNotEmpty(arrayOne, arrayTwo){ 
     
    \t 
     
    \t return (Array.isArray(arrayOne)? arrayOne.length > 0 : false) || (Array.isArray(arrayTwo)? arrayOne.length > 0 : false) 
     
    } 
     
    
     
    console.log(isOneNotEmpty([],null)); 
     
    console.log(isOneNotEmpty([1,2,3,4],null)); 
     
    console.log(isOneNotEmpty([3,4,5],[1]));

    関連する問題