2012-05-06 2 views
1

나는이어레이의 모든 부울 사이에 OR을 적용하는 방법은 무엇입니까?

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

내가 원하는이 같은 배열에 적어도 하나의 true,이 있다면 true을 반환하는 함수 : 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)); 

가 어떻게 더 간결이 결과를 달성 할 수 있습니까?

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

@TimPietzcker 나는 파이썬도 좋아한다! 바로 지금 나는 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/en/JavaScript/Reference/Global_Objects/Array/some#Compatibility)도 포함되어 있습니다. –

4

글쎄, 당신은 루프를 종료 할 수 있을까?

+0

좋은 생각입니다! –

2

배열의 모든 요소를 ​​논리적으로 or'ing하는 것은 그 중 하나만 true가되는 것과 같습니다. (이 구문은 이미 많은 의미가 없기 때문에, 나는 별도의 함수를 작성하지 않았다)

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

'++ i'를 수행하고 있기 때문에 첫 번째 값을 건너 뛸 수 있습니다. – MilkyWayJoe

+2

사실이 아니고, for 루프의 세 번째 표현식은 첫 번째 반복 이후까지 평가되지 않습니다. –

+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

관련 문제