2012-05-06 4 views
1

私は、少なくとも1 trueはこのように、配列であるかどうtrueを返す関数たい配列内のすべての論理積の間にORを適用する方法は?

x = [false, false, true, true, false]

を持っている:http://jsfiddle.net/7uVWk/

x = [false, false, true, true, false]; 

function hasTrue(x) { 
    result = false; 
    ​for (var i=0; i <​x.length; i++) { 
    result = result || x[i]; 
    } 
} 
document.write(hasTrue(result)); 

どのように私はより簡潔に、この結果を達成することができますか?

+0

@TimPietzcker私もPythonが好きです!ちょうど今、私はnode.jsと格闘しています。それはかなりのペースの変化です。 –

答えて

5

Array.prototype.someを使用して(この構文は、すでにあまり意味がないので、私は、別の関数を書いていない):

var x = [false, false, true, true, false]; 
x.some(function(val) { 
    return val === true; 
}); // true or false. In this case, true 
+0

私は以前にその方法が使用されたことは一度もありませんでした。 –

+0

Brilliant!あなたは男です! –

+0

@JamesGauntリンクされたドキュメントを参照してください。また、[polyfill](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/some#Compatibility)も含まれています。 –

4

さて、あなたはあなたの最初の真のを見つけたときにループを終了することができます:

x = [false, false, true, true, false]; 

function hasTrue(x) { 
    ​for (var i=0; i <​x.length; i++) { 
    if(x[i]) return true; 
    } 
    return false; 
} 
document.write(hasTrue(result)); 

は十分にその簡潔ですか?

+0

それは素晴らしいアイデアです! –

2

アレイ内のすべての要素を論理的にor'ingすることは、それらのうちの1つだけが真であることに相当します。次の関数は、はるかに効率的になります:

function arrayHasTrue(x_) 
{ 
    for(var i = 0; i < x_.length; ++i) 
    { 
     if(x_[ i ]) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

これは '++ i'を実行しているので最初の値をスキップする可能性があります – MilkyWayJoe

+2

' for'ループの3番目の式は、最初の反復後まで評価されません。 –

+0

私は確信していませんでしたので、私は* might *と言っています、そして、これは何もスキップしません。 – MilkyWayJoe

0

あなたは再帰使用することができます

function hasTrue(x) { 
    return x.length == 1 ? x[0] : x[0] || hasTrue(x.slice(1)); 
} 
+0

慣習的ではありませんが、動作しますので、私のupvoteを持っています:) –

+0

これは長い間、 'x'をコピーするのに多くの時間を費やすでしょう。 –

+0

@KevinReid:もちろん、OPは速い解決策を求めていませんでした。あなたが自分で発明したいくつかの基準を満たしていないので、答えを下降させましたか? – Guffa

関連する問題