2017-03-06 1 views
3

실제 사례가 아니므로 지나치게 단순화했습니다. 이 배열주기 : 나는 단지 패턴과 일치하는 사람들이 그것을 필터링 할처음 몇 가지 조건이 충족 될 때까지 필터하기

const a = [1,2,3,4,5,6,7,8,4,5]; // Etc. Random numbers after. 

하는 일이 처음으로 추가 할 때까지 (의이 사소한 예를 들어보다 3 가정 해 봅시다) (의이 요소가 7보다 큰 가정 해 봅시다)

그래서이 예를 들어, 난 그냥 원하는 : [4,5,6,7]. 그러나 filter로, 나는 45 후행 것 :
const a = [1,2,3,4,5,6,7,8,4,5].filter((v) => v > 3) 
// returns: [4, 5, 6, 7, 8, 4, 5] 

그래서 내가 배열에서 항목을 얻고 결정적 조건 후에 중지합니다. 어떻게하면 조건을 충족하지 처음으로 후 필터를 중지 할 수 있습니까?

const a = [1,2,3,4,5,6,7,8,4,5,1,2,976,-1].awsome_function(); 
// returns: [4, 5, 6, 7, 8] because it stopped after the first 8. 
+0

"조건"는 "요소가 7보다 큰 처음"입니다. 나는 불분명하게되어서 유감입니다. (제 생각에는 제 질문 전체가 명확하지 않다고 생각합니다. 정확히 어떻게 해야할지 모르겠습니다) –

답변

4

당신은 Array#some를 사용하여 두 조건을 결합 할 수 있습니다 (for 루프없이, 나는 "기능 같은"그것을 유지하려는). 당신은 기능적인 스타일을 유지하려면

var array = [1,2,3,4,5,6,7,8,4,5], 
 
    result = []; 
 

 
array.some(a => (a > 3 && result.push(a), a > 7)); 
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES5

var array = [1,2,3,4,5,6,7,8,4,5], 
 
    result = []; 
 

 
array.some(function (a) { 
 
    if (a > 3) { 
 
     result.push(a); 
 
    } 
 
    return a > 7; 
 
}); 
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

어떻게 작동하는지 알려주실 수 있습니까? 솔직히, 나는'Array # some'을 사용하는 이런 방법을 아직 보지 못했습니다. 당신은 두 가지 주장을 안쪽으로 전달하고 있습니까? –

+0

감사합니다. 귀하의 코드를 읽었지만 논리를 이해하지 못합니다. 나는'some'이 부울을 반환 할 것이지만'(a> 3 && result.push (a), a> 7)'부분이 정말로 이상하게 들린다 (나는 아직도 배워야 만한다). –

+1

나는 es5 스타일은 더 읽기 쉽습니다. 기본적으로 값이 3보다 크고 결과 집합에 값을 넣으면 7보다 큰 수표를 반환합니다. 'true'이면 반복이 중지됩니다. –

1

이를 사용할 수 있습니다

Array.prototype.filterUntil = function(predicate, stop){ 

    let shouldStop = false; 

    return this.filter(function filter(value, index){ 
    if(stop(value)){ 
     shouldStop = true; 
    } 

    return shouldStop && predicate(value); 
    }); 
} 
귀하의 경우에는 16,

이처럼 호출 할 수

data.filterUntil(value => value > 3, value => value < 7) 
관련 문제