2013-07-02 10 views
5

Diciamo che ho un array:Come posso restituire tutti gli elementi precedenti in un array JavaScript rispetto a un valore corrente?

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

e che voglio una funzione per restituire una matrice di tutti gli articoli prima di un determinato elemento:

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

Qual è il modo più veloce per ottenere questo? Posso dividere un array su un valore? Devo eseguire il ciclo di ciascuno di essi e creare un nuovo array al volo? Che cosa mi consiglia?

E se volessi il contrario, ovvero getAllAfter()?

+2

Usa 'indexOf' per ottenere la posizione del primo elemento che corrisponde a quello che stai cercando. Quindi usa 'slice' da 0 a quell'indice – Ian

+1

Usa' .indexOf() 'per trovare la corrispondenza e' .slice() 'per fare una copia di una parte dell'array. – jfriend00

+0

Non c'è bisogno di slice, basta impostare la lunghezza all'indice + 1 (purché la modifica dell'originale sia OK). :-) Inoltre, Array.prototype.indexOf è ES5 quindi potrebbe aver bisogno di ulteriore supporto per i browser più vecchi. – RobG

risposta

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

ottenere l'indice della voce specificata. Se trovato, .slice() da 0 a quell'indice. Se non trovato, restituisce un array vuoto (o qualsiasi altro valore predefinito che ti piace).

Nota che .indexOf() non è supportato (per gli array) in IE8 e più anziani, ma c'è a shim è possibile utilizzare, oppure si potrebbe utilizzare un semplice for ciclo, invece.

+0

Grazie! Cosa cambierei per ottenere 'getAllAfter (corrente)'? – Ryan

+1

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

+1

Tutto dopo? 'return i> -1? myArr.slice (i + 1): myArr.slice (0); '- ovvero, restituisce da 1 dopo l'indice se l'elemento è stato trovato, altrimenti restituisce una copia dell'intero array se non trovato (o qualunque altro valore predefinito si vuoi per quando non trovato, puoi usare 'return i> -1? myArr.slice (i + 1): [];' per default su un array vuoto). – nnnnnn

1

Usa indexOf e slice:

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

quale indice di restituzione di -1? –

+0

@PilgerstorferFranz non ci si preoccupa, restituisce solo un array vuoto. – McGarnagle

+2

@McGarnagle: No, restituisce tutto tranne l'ultimo elemento. – Bergi

0

provare qualcosa di simile

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