2013-07-02 13 views
5

Sagen wir, ich habe ein Array:Wie kann ich alle vorherigen Elemente in einem JavaScript-Array als einen aktuellen Wert zurückgeben?

var myArr = new Array('alpha','beta','gamma','delta'); 

Und das möchte ich eine Funktion ein Array aller Elemente vor einem bestimmten Artikel zurückgeben:

function getAllBefore(current) { 
    var myArr = new Array('alpha','beta','gamma','delta'); 
    var newArr = ??? 
    return newArr; 
} 

getAllBefore('beta'); // returns Array('alpha'); 
getAllBefore('delta'); // returns Array('alpha','beta','gamma'); 

Was ist der schnellste Weg, dies zu umgehen? Kann ich ein Array auf einen Wert aufteilen? Muss ich jede einzelne Schleife wiederholen und ein neues Array im laufenden Betrieb erstellen? Was empfehlen Sie?

Was ist, wenn ich das Gegenteil wollte, d. H. getAllAfter()?

+2

Verwenden 'indexOf' Versuchen Sie, die Position des ersten Elements zu erhalten, die dem entspricht, was Sie suchen. Verwenden Sie dann 'slice' von 0 bis zum Index – Ian

+1

Verwenden Sie' .indexOf() ', um die Übereinstimmung und' .slice() 'zu finden, um eine Kopie eines Teils des Arrays zu erstellen. – jfriend00

+0

Keine Notwendigkeit für Slice, legen Sie einfach die Länge auf den Index + 1 (solange die Änderung des Originals in Ordnung ist). :-) Array.prototype.indexOf ist ES5 und benötigt möglicherweise zusätzliche Unterstützung für ältere Browser. – RobG

Antwort

15
function getAllBefore(current) { 
    var myArr = new Array('alpha','beta','gamma','delta'); 
    var i = myArr.indexOf(current); 
    return i > -1 ? myArr.slice(0, i) : []; 
} 

den Index des angegebenen Elements holen. Wenn gefunden, .slice() von 0 bis zu diesem Index. Falls nicht gefunden, gebe ein leeres Array (oder einen anderen Standardwert, den du magst) zurück.

Beachten Sie, dass .indexOf() nicht unterstützt wird (für Arrays) in IE8 und älter, aber es gibt a shim können Sie verwenden, oder Sie könnten einfach eine einfache for Schleife stattdessen verwenden.

+0

Danke! Was würde ich ändern, um "getAllAfter (current)" zu erhalten? – Ryan

+1

@Ryan 'myArr.slice (i + 1)' – Ian

+1

Alle nach? 'Rückkehr i> -1? myArr.slice (i + 1): myArr.slice (0); '- Rückgabe von 1 nach dem Index, wenn das Element gefunden wurde, ansonsten Rückgabe einer Kopie des gesamten Arrays, falls nicht gefunden will für wenn nicht gefunden, du könntest 'return i> -1? myArr.slice (i + 1): [];' als Standard für ein leeres Array verwenden. – nnnnnn

1

Verwenden indexOf und slice:

newArr = myArr.slice(0, myArr.indexOf(current)); 
+2

Wieviel Index von -1? –

+0

@PilgerstorferFranz keine Sorgen da, es würde nur ein leeres Array zurückgeben. – McGarnagle

+2

@McGarnagle: Nein, es gibt dann alles außer dem letzten Element zurück. – Bergi

0

so etwas wie dieses

var index = myArr.indexOf('beta'); 
var before = myArray.slice(0, index); 
Verwandte Themen