¿Cómo truncar fácilmente una matriz con JavaScript?

102

Linq tiene un método de operador conveniente llamado Take()para devolver un número determinado de elementos en cualquier cosa que implemente IEnumerable. ¿Hay algo similar en jQuery para trabajar con matrices?

O, preguntado de otra manera: ¿cómo puedo truncar una matriz en Javascript?

Alan Le
fuente
22
Chicos, por favor, aprendan JavaScript antes que jQuery. Me temo que las preguntas de mañana serán "¿Qué otros tipos de datos expone jQuery además de las matrices?".
Ionuț G. Stan

Respuestas:

184

Hay un método de corte

array.slice(0, 4);

Devolverá los primeros cuatro elementos.

No olvide volver a asignarlo a su variable si desea descartar los otros valores.

Nota: Esto es solo un javascript normal, no es necesario jquery.

Beto
fuente
15
¿No devolvería (0,4) los primeros 4 y no los primeros 5?
Simon Keep
11
En realidad, eso no es cierto. Simon Keep es correcto: el segundo argumento del método .slice () es la posición de la matriz después del último elemento que se devolverá. array.slice (0, 4) devolvería los elementos 0, 1, 2 y 3, un total de 4 elementos. Piense en el segundo argumento como el punto de corte, donde .slice (0, x) devolverá todos los elementos desde el principio de la matriz, hasta pero sin incluir x.
Bungle
1
endNO está incluido, entonces @SimonKeep tiene razón, consulte MDN developer.mozilla.org/en-US/docs/JavaScript/Reference/…
AsTeR
2
Recuerde asignarlo de nuevo a la variable, es muy importante por simple que parezca
kolexinfos
6
De mala manera, crea una nueva instancia de matriz, tenga en cuenta el uso de memoria cuando codificar js no es una mala idea.
G. Ghez
125

(2 años después ...) Si realmente está buscando truncar una matriz, también puede usar el lengthatributo:

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

Nota: si asigna una longitud mayor que la longitud actual, se introducen elementos de matriz indefinidos, como se muestra a continuación.

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

EDITAR:

Como @twhitehead se menciona a continuación, la adición de elementos indefinidos se puede evitar haciendo esto:

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = Math.min(stooges.length, 5); 
alert(stooges.length)// alerts "3"
Jonathan M
fuente
5
Me sorprendió primero cuando vi esto en un código ... Pero es la mejor manera (si está truncando desde el índice 0) davidwalsh.name/empty-array
kumarharsh
5
Esta es una solución asombrosamente simple.
Dominique
3
¿Qué pasa con la recolección de basura de esta manera?
G. Ghez
1
@JonathanM En realidad, no se introducen valores nulos; las nuevas variables son indefinidas, ya que se declaran pero no se les asigna ningún valor.
Håvard Geithus
3
¡Asombroso! Vale la pena decir que este método modifica el mismo en Arraylugar de crear uno nuevo Array.
Roomy
22

Si está preguntando cómo truncar (modificar una matriz eliminando los elementos del final), use splice :

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

Si está preguntando cómo recuperar un subconjunto de una matriz sin modificar el original, utilice slice .

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

Solo recuerde modificaciones de empalme, accesos de corte. Los números negativos como primer argumento indican un índice desde el final de la matriz.

Chadwick
fuente
11

Establezca la propiedad .length en un valor más bajo.

Documentación oficial: Array.prototype.length

G. Ghez
fuente
3
para eliminar todos los elementos de la matriz, lo más fácil es establecer la longitud en cero.
hanmari
5

Si desea tanto obtener los elementos como eliminarlos de la matriz, use splice .

Si desea mantener los elementos en la matriz, use slice

PatrikAkerstrand
fuente
1

Si desea extraer elementos de una matriz de forma selectiva, puede utilizar el método jQuery.grep .

(de los documentos de 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
fuente