Jak łatwo skrócić tablicę za pomocą JavaScript?

102

Linq ma wygodną metodę operatora, Take()która zwraca określoną liczbę elementów we wszystkim, co implementuje IEnumerable. Czy jest coś podobnego w jQuery do pracy z tablicami?

Albo inaczej: jak obciąć tablicę w JavaScript?

Alan Le
źródło
22
Chłopaki, proszę, nauczcie się JavaScript przed jQuery. Obawiam się, że jutrzejsze pytania będą brzmiały: „Jakie inne typy danych ujawnia jQuery poza tablicami?”.
Ionuț G. Stan

Odpowiedzi:

184

Jest metoda plastrów

array.slice(0, 4);

Zwróci pierwsze cztery elementy.

Nie zapomnij przypisać go z powrotem do swojej zmiennej, jeśli chcesz odrzucić inne wartości.

Uwaga: to jest zwykły javascript, nie ma potrzeby używania jquery.

Pion
źródło
15
Czy (0,4) nie zwróci pierwszych 4, a nie pierwszych 5?
Simon Keep
11
To właściwie nieprawda. Simon Keep jest poprawny - drugim argumentem metody .slice () jest pozycja tablicy po ostatnim zwracanym elemencie. array.slice (0, 4) zwróci elementy 0, 1, 2 i 3 - w sumie 4 elementy. Myśleć drugiego argumentu jako punktu granicznego, w którym .slice (0, x) powróci wszystkie elementy z początku układu, aż do, lecz nie włącznie x.
Bungle
1
endNIE jest uwzględniony, to @SimonKeep ma rację, patrz MDN developer.mozilla.org/en-US/docs/JavaScript/Reference/…
AsTeR
2
Pamiętaj, aby przypisać go z powrotem do zmiennej, jest to bardzo ważne, tak proste, jak mogłoby się wydawać
kolexinfos
6
zły sposób, tworzysz nową instancję tablicy, pamiętaj o zużyciu pamięci, gdy kodowanie js nie jest złym pomysłem.
G. Ghez
125

(2 lata później ...) Jeśli naprawdę chcesz skrócić tablicę, możesz również użyć lengthatrybutu:

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

Uwaga: jeśli przypiszesz długość, która jest większa niż bieżąca długość, zostaną wprowadzone niezdefiniowane elementy tablicy, jak pokazano poniżej.

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

EDYTOWAĆ:

Jak wspomniano poniżej @twhitehead, można uniknąć dodawania niezdefiniowanych elementów, wykonując następujące czynności:

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = Math.min(stooges.length, 5); 
alert(stooges.length)// alerts "3"
Jonathan M
źródło
5
Byłem zaskoczony, kiedy zobaczyłem pierwsze to w kodzie ... Ale to jest najlepszy sposób (jeśli obcinania z indeksem 0) davidwalsh.name/empty-array
kumarharsh
5
To niezwykle proste rozwiązanie.
Dominique
3
A co ze zbieraniem śmieci w ten sposób?
G. Ghez
1
@JonathanM Właściwie wartości null nie są wprowadzane; nowe zmienne są niezdefiniowane, ponieważ są zadeklarowane, ale nie mają przypisanej żadnej wartości.
Håvard Geithus
3
Niesamowity! Warto powiedzieć, że ta metoda modyfikuje to samo Arrayzamiast tworzyć nowe Array.
Roomy
22

Jeśli pytasz, jak obciąć (zmodyfikować tablicę, usuwając elementy z końca), użyj splice :

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

Jeśli pytasz, jak pobrać podzbiór tablicy bez modyfikowania oryginału, użyj plasterka .

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

Pamiętaj tylko o modyfikacjach łączenia, dostępach do wycinków. Liczby ujemne jako pierwszy argument wskazują indeks od końca tablicy.

Chadwick
źródło
11

Ustaw właściwość .length na niższą wartość.

Oficjalna dokumentacja: Array.prototype.length

G. Ghez
źródło
3
aby zabić wszystkie elementy tablicy, najłatwiej jest ustawić długość na zero.
hanmari
5

Jeśli chcesz zarówno pobrać elementy, jak i usunąć je z tablicy, użyj splice .

Jeśli chcesz zachować elementy w tablicy, użyj plasterka

PatrikAkerstrand
źródło
1

Jeśli chcesz selektywnie wyciągać elementy z tablicy, możesz użyć metody jQuery.grep .

(z dokumentacji 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(", "));
ScottKoon
źródło