Como truncar facilmente uma matriz com JavaScript?

102

Linq tem um método de operador conveniente chamado Take()para retornar um determinado número de elementos em qualquer coisa que implemente IEnumerable. Existe algo semelhante no jQuery para trabalhar com matrizes?

Ou, de outra forma: como posso truncar uma matriz em Javascript?

Alan Le
fonte
22
Pessoal, por favor, aprendam JavaScript antes do jQuery. Receio que as perguntas de amanhã serão "Quais outros tipos de dados o jQuery expõe além de Arrays?".
Ionuț G. Stan

Respostas:

184

Existe um método de fatia

array.slice(0, 4);

Retornará os primeiros quatro elementos.

Não se esqueça de atribuí-lo de volta à sua variável se quiser descartar os outros valores.

Nota: Este é apenas javascript normal, sem necessidade de jquery.

Prumo
fonte
15
Não (0,4) retornaria os 4 primeiros não os 5 primeiros?
Simon Keep
11
Isso não é verdade. Simon Keep está correto - o segundo argumento do método .slice () é a posição do array após o último elemento a ser retornado. array.slice (0, 4) retornaria os elementos 0, 1, 2 e 3 - um total de 4 elementos. Pense no segundo argumento como o ponto de corte, onde .slice (0, x) retornará todos os elementos do início da matriz, até mas não incluindo x.
Bungle
1
endNÃO está incluído, então @SimonKeep está certo, consulte MDN developer.mozilla.org/en-US/docs/JavaScript/Reference/…
AsTeR
2
Lembre-se de atribuí-lo de volta à variável, é muito importante, por mais simples que possa parecer
kolexinfos
6
Caso contrário, você cria uma nova instância de array, lembre-se do uso de memória quando codificar js não é uma má ideia.
G. Ghez
125

(2 anos depois ...) Se você realmente deseja truncar uma matriz, também pode usar o lengthatributo:

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

Nota: se você atribuir um comprimento maior do que o comprimento atual, elementos indefinidos da matriz serão introduzidos, conforme mostrado abaixo.

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

EDITAR:

Como @twhitehead mencionado abaixo, a adição de elementos indefinidos pode ser evitada ao fazer isso:

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = Math.min(stooges.length, 5); 
alert(stooges.length)// alerts "3"
Jonathan M
fonte
5
Fiquei surpreso pela primeira vez quando vi isso em um código ... Mas é a melhor maneira (se você estiver truncando do índice 0) davidwalsh.name/empty-array
kumarharsh
5
Esta é uma solução incrivelmente simples.
Dominique
3
E a coleta de lixo feita dessa maneira?
G. Ghez
1
@JonathanM Na verdade, os valores nulos não são introduzidos; as novas variáveis ​​são indefinidas, pois são declaradas, mas não têm nenhum valor atribuído.
Håvard Geithus de
3
Surpreendente! Vale dizer que este método está modificando o mesmo ao Arrayinvés de criar um novo Array.
Espaçoso,
22

Se você está perguntando como truncar (modificar uma matriz removendo os elementos do final), use a emenda :

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

Se você está perguntando como recuperar um subconjunto de uma matriz sem modificar o original, use a fatia .

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

Lembre-se de que o splice modifica, acessa o slice Números negativos como o primeiro argumento indicam o índice do final da matriz.

Chadwick
fonte
11

Defina a propriedade .length com um valor inferior.

Documentação oficial: Array.prototype.length

G. Ghez
fonte
3
para eliminar todos os elementos do array, é mais fácil definir o comprimento como zero.
hanmari
5

Se você deseja obter os elementos e também removê-los do array, use splice .

Se você quiser manter os elementos na matriz, use fatia

PatrikAkerstrand
fonte
1

Se você deseja extrair seletivamente elementos de um array, pode usar o método jQuery.grep .

(dos documentos 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
fonte