2017-03-06 3 views
3

実際の例ではありません。私は、パターンに一致するを持って、それをフィルタリングする初めて条件が満たされるまでフィルタリングします

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

を何かが初めて追加されるまで(の要素が7以上であるとしましょう)(のは、この簡単な例のために3より大きいをしましょう):この配列を与えます

この例では、私はちょうど望んでいます:[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] 

をだから私は、配列から項目を取得し、決定的条件の後に停止します。どのようにフィルタリングし、最初に条件が満たされた後に停止することができますか?あなたはArray#someを使用し、両方の条件を組み合わせることができ

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

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'を使うこの方法をまだ見ていませんでした。あなたは2つの引数を内部に渡していますか? –

+0

ありがとう!私はあなたのコードを読んだが、私はその論理を理解していない。私は ''いくつか ''ブール値を返しますが、 ''(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); 
    }); 
} 
あなたのケースでは

あなたはこのようにそれを呼び出すことができます。

data.filterUntil(value => value > 3, value => value < 7) 
関連する問題