2016-12-17 13 views
1

対JavaScriptの反復:両方のコードは、コードが入っている場合は、単純にtrueを返し、同じことを行う必要があります私はこの違いについて疑問に思ってフィルタマップ

function doesCodeExist(arrvalidcodes, code) { 

    for (var i = 0; i < arrvalidcodes.lenght; i++) { 
    if (arrvalidcodes[i] === code) { 
     return true; 
    } 
    } 
    return false; 
} 

function doesCodeExist(arrvalidcodes, code) { 

    var hit = arrvalidcodes.filter(function(item){ 
    return (code === item) 
    }).map(function(item){ 
    return true; 
    }); 
    if (hit[0] === true) { 
    return true; 
    } else { 
    return false; 
    } 
} 

と、この指定された配列またはそれ以外の場合はfalseを返します。

これは最も読みやすく、効率的な方法です。

+0

私は、最初の部分がすべての項目をループしている間に、あなたが何かを見つけたら直ちにforループが存在するので、2番目のブロックがより効率的だと言います(そして、それもまた読み込まれません。 2番目の部分 – Icepickle

+0

これは読みやすいと思いますか?この{if(hit [0] === true){ trueを返します; } else { return false; } 'これを短縮できます:' returnヒット[0] === true; ' – Craicerjack

+2

@Craicerjack' hit [0] 'は、' true'以外のもの、 'undefined'(後者の場合は' hit.length === 0')どちらの方法でも、このように '.filter'と' .map'を使うと、直感的で非効率的で、配列内の要素の存在をチェックする非効率的な方法です。 – Alnitak

答えて

1

あなたはArray#indexOf

indexOf()方法は、それが存在しない場合、所与の素子がアレイ状に見つかった、または-1可能な最初のインデックスを返す使用することができます。

function doesCodeExist(arrvalidcodes, code) { 
    return arrvalidcodes.indexOf(code) !== -1; 
} 

またはES6と、それは様々な無用の配列を割り当て、読み取り可能ではありませんので、あなたの最初のコードが悪化しているもちろんArray#includes

+0

のようです厳しいdownvote – Alnitak

+0

ありがとうございました。ありがとうございました:) –

2

を使用しています。

あなたはセマンティックES5の配列方法をしたい場合は、someを使用します。もちろん

function doesCodeExist(arrvalidcodes, code) { 
    return arrvalidcodes.some(function(item){ 
    return code === item; 
    }); 
} 

を、ちょうど厳密な比較のために、あなたはindexOfを使用する必要があります、またはあなたがSameValueZeroのcomparisson使用includesをしたいです。

+0

IMHOでは、 '.indexOf'(または使用可能な場合は' .includes')を使用する方が、 '.some'でカスタムの述語関数を使用するよりも優れています。コールバックを使った完全なネイティブの同等性テスト。 – Alnitak

+0

@Alnitakはい、それは私が最後のパラグラフで意味したことです。しかし、カスタマイズされた比較のために、 'filter'と' map'の代わりに 'some'を使うべきです。 – Oriol

+0

はい、絶対に 'some'はカスタムコンパレータの方が優れています。しかし、純粋な平等テストの方が悪いです。 – Alnitak

関連する問題