2017-03-06 2 views
3

Es ist kein reales Beispiel, ich habe es zu sehr vereinfacht. Geben Sie dieses Array: diejenigen passend ein Muster (sagen wir mal größer als 3 sind für dieses triviales Beispiel) haben nurFilter, bis eine Bedingung zum ersten Mal erfüllt ist

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

Ich möchte es filtern, bis etwas zum ersten Mal anhängt (sagen wir mal Element größer als 7)

Also für dieses Beispiel möchte ich nur: [4,5,6,7]. Aber mit filter, würde ich die Hinter haben 4 und 5:

const a = [1,2,3,4,5,6,7,8,4,5].filter((v) => v > 3) 
// returns: [4, 5, 6, 7, 8, 4, 5] 

Deshalb möchte ich holen Artikel aus einem Array und endgültig nach einer Bedingung zu stoppen. Wie kann ich filteren und nach dem ersten Mal stoppen, wenn eine Bedingung nicht erfüllt wird? (Ohne for Schleife, will ich es halten "functional-like")

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

„Die Bedingung“ ist „das erste Mal ein Element größer als 7 ist“. Es tut mir leid, dass ich nicht klar bin (um ehrlich zu sein, ich denke, meine ganze Frage ist unklar, ich weiß nicht, wie ich das genau machen soll) –

Antwort

4

Sie Array#some nutzen könnten und beide Bedingungen kombinieren.

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

Können Sie mir sagen, wie es funktioniert? Um ehrlich zu sein, habe ich diese Art der Verwendung von "Array # einige" noch nicht gesehen. Übergeben Sie zwei Argumente, oder was? –

+0

Ok danke! Ich habe deinen Code gelesen, aber ich verstehe die Logik nicht. Ich weiß, 'einige' werden einen booleschen Wert zurückgeben, aber der' (a> 3 && result.push (a), a> 7) 'Teil klingt für mich wirklich komisch (ich muss es noch lernen) –

+1

Ich habe dasselbe hinzugefügt ein es5-Stil, der besser lesbar ist. im Grunde prüft es, ob der Wert größer als 3 ist und drückt den Wert auf die Ergebnismenge, dann gibt es die Prüfung für mehr als 7 zurück. Wenn "wahr", dann stoppt die Iteration. –

1

Wenn Sie den funktionalen Stil halten möchten, können Sie diese verwenden:

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); 
    }); 
} 

In Ihrem Fall können Sie es so nennen:

data.filterUntil(value => value > 3, value => value < 7) 
Verwandte Themen