Come troncare facilmente un array con JavaScript?


102

Linq ha un comodo metodo operatore chiamato Take()per restituire un dato numero di elementi in qualsiasi cosa venga implementata IEnumerable. C'è qualcosa di simile in jQuery per lavorare con gli array?

Oppure, chiesto diversamente: come posso troncare un array in Javascript?


22
Ragazzi, per favore, imparate JavaScript prima di jQuery. Temo che le domande di domani saranno "Quali altri tipi di dati espone jQuery oltre ad Arrays?".
Ionuț G. Stan

Risposte:


184

C'è un metodo slice

array.slice(0, 4);

Restituirà i primi quattro elementi.

Non dimenticare di riassegnarlo alla tua variabile se vuoi scartare gli altri valori.

Nota: questo è solo un normale javascript, non è necessario jquery.


15
(0,4) non restituirebbe i primi 4 non i primi 5?
Simon Keep,

11
In realtà non è vero. Simon Keep ha ragione: il secondo argomento del metodo .slice () è la posizione dell'array dopo l'ultimo elemento da restituire. array.slice (0, 4) restituirà gli elementi 0, 1, 2 e 3, per un totale di 4 elementi. Pensa al secondo argomento come al punto di interruzione, dove .slice (0, x) restituirà tutti gli elementi dall'inizio della matrice, fino a x esclusa .
Bungle

1
endNON è incluso, quindi @SimonKeep ha ragione, vedere MDN developer.mozilla.org/en-US/docs/JavaScript/Reference/…
AsTeR

2
Ricordati di
riassegnarlo

6
nel modo sbagliato, crei una nuova istanza di array, tieni presente l'utilizzo della memoria quando codificare js non è una cattiva idea.
G. Ghez

125

(2 anni dopo ...) Se stai veramente cercando di troncare un array, puoi anche usare l' lengthattributo:

var stooges = ["Moe", "Larry", "Shemp", "Curly", "Joe"];
stooges.length = 3; // now stooges is ["Moe", "Larry", "Shemp"]

Nota: se si assegna una lunghezza maggiore della lunghezza corrente, vengono introdotti elementi di array non definiti, come mostrato di seguito.

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = 5;
alert(typeof stooges[4]); // alerts "undefined"

MODIFICARE:

Come @twhitehead menzionato di seguito, l'aggiunta di elementi non definiti può essere evitata in questo modo:

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = Math.min(stooges.length, 5); 
alert(stooges.length)// alerts "3"

5
Sono rimasto sorpreso per primo quando ho visto questo in un codice ... Ma è il modo migliore (se stai troncando dall'indice 0) davidwalsh.name/empty-array
kumarharsh

5
Questa è una soluzione sorprendentemente semplice.
Dominique

3
Che ne dici della raccolta dei rifiuti in questo modo?
G. Ghez

1
@JonathanM In realtà, i valori nulli non vengono introdotti; le nuove variabili sono indefinite, in quanto vengono dichiarate ma a cui non viene assegnato alcun valore.
Håvard Geithus

3
Sorprendente! Vale la pena dire che questo metodo sta modificando lo stesso Arrayinvece di crearne uno nuovo Array.
Roomy

22

Se stai chiedendo come troncare (modificare un array rimuovendo gli elementi dalla fine), usa splice :

var a1 = [2,4,6,8];
var a2 = a1.splice(-2,2); // a1=[2,4], a2=[6,8]

Se stai chiedendo come recuperare un sottoinsieme di un array senza modificare l'originale, usa slice .

var a1 = [2,4,6,8];
var a2 = a1.slice(-2); // a1=[2,4,6,8], a2=[6,8]

Ricorda solo le modifiche di giunzione, gli accessi alle sezioni. I numeri negativi come primo argomento indicano l'indice dalla fine della matrice.


11

Imposta la proprietà .length su un valore inferiore.

Documentazione ufficiale: Array.prototype.length


3
per eliminare tutti gli elementi nell'array, impostare la lunghezza su zero è più semplice.
hanmari


1

Se desideri estrarre selettivamente gli elementi da un array, puoi utilizzare il metodo jQuery.grep .

(dalla documentazione di jQuery)

var arr = [ 1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1 ];

$("div").text(arr.join(", "));

arr = jQuery.grep(arr, function(n, i){
  return (n != 5 && i > 4);
});

$("p").text(arr.join(", "));

arr = jQuery.grep(arr, function (a) { return a != 9; });
$("span").text(arr.join(", "));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.