¿Cómo obtener subarreglos de la matriz?

263

Tengo var ar = [1, 2, 3, 4, 5]y quiero alguna función getSubarray(array, fromIndex, toIndex), ese resultado de la llamada getSubarray(ar, 1, 3)es una nueva matriz [2, 3, 4].

Sergey Metlov
fuente
10
¿Has probado rebanada ?
Tom Knapen

Respuestas:

408

Echa un vistazo a Array.slice(begin, end)

const ar  = [1, 2, 3, 4, 5];

// slice from 1..3 - add 1 as the end index is not included

const ar2 = ar.slice(1, 3 + 1);

console.log(ar2);

Alex K.
fuente
22
Probablemente valga la pena mencionar explícitamente aquí que el original arno ha sido modificado. console.log(ar); // -> [1, 2, 3, 4, 5]
daemonexmachina
17

Para un uso simple de slice, use mi extensión a Array Class:

Array.prototype.subarray = function(start, end) {
    if (!end) { end = -1; } 
    return this.slice(start, this.length + 1 - (end * -1));
};

Luego:

var bigArr = ["a", "b", "c", "fd", "ze"];

Prueba1 :

bigArr.subarray(1, -1);

<["b", "c", "fd", "ze"]

Test2:

bigArr.subarray(2, -2);

<["c", "fd"]

Test3:

bigArr.subarray(2);

<["c", "fd", "ze"]

Podría ser más fácil para los desarrolladores que vienen de otro idioma (es decir, Groovy).

Abdennour TOUMI
fuente
Lo que dijo K_7; más especialmente, el parchear los Builtins (Objeto, Array, Promesa, etc.) es muy travieso. Vea el famoso ejemplo de MooTools que obliga a cambiar el nombre del nativo propuesto Array.prototype.containsa Array.prototype.includes.
daemonexmachina
Sin mencionar que su subarraymétodo ofrece resultados inesperados. bigArr.slice(1,-1)devuelve ['b','c','fd'], lo que cabría esperar (el -1 elimina un elemento del final de la nueva matriz). Pero bigArr.subarray(1,-1)devuelve lo mismo que bigArr.subarray(1), es decir todo desde la posición 1 hasta el final de bigArr. También está obligando a los usuarios a dar siempre números negativos como endparámetro. Cualquiera end >= -1da el mismo resultado que cuando end === undefined. Por otro lado, bigArr.slice(1,3)regresa ['b','c'], lo que nuevamente se espera.
daemonexmachina
5

const array_one = [11, 22, 33, 44, 55];
const start = 1;
const end = array_one.length - 1;
const array_2 = array_one.slice(start, end);
console.log(array_2);

Hannad Rehman
fuente
no compila aquí la corrección: var array_one = [11, 22, 33, 44,55]; var ar2 = array_one.slice (0, array_one.length-1); console.log (ar2)
bormat
0

La pregunta en realidad es pedir una nueva matriz , por lo que creo que una mejor solución sería combinar la respuesta de Abdennour TOUMI con una función de clonación:

function clone(obj) {
  if (null == obj || "object" != typeof obj) return obj;
  const copy = obj.constructor();
  for (const attr in obj) {
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
  }
  return copy;
}

// With the `clone()` function, you can now do the following:

Array.prototype.subarray = function(start, end) {
  if (!end) {
    end = this.length;
  } 
  const newArray = clone(this);
  return newArray.slice(start, end);
};

// Without a copy you will lose your original array.

// **Example:**

const array = [1, 2, 3, 4, 5];
console.log(array.subarray(2)); // print the subarray [3, 4, 5, subarray: function]

console.log(array); // print the original array [1, 2, 3, 4, 5, subarray: function]

[ http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object]

usuario73362
fuente
9
No creo que esa porción cambie la matriz original.
Mani
10
Array.prototype.slicedevuelve una copia ya. Array.prototype.splicemodifica la matriz original.
Guido Bouman
2
El método slice () devuelve una copia superficial de una parte de una matriz en un nuevo objeto de matriz. Ver Mozilla Developer Network . Voto negativo
TheCrazyProgrammer
Como han dicho otros, sliceya devuelve una copia superficial, haciendo subarrayinnecesaria esta implementación. Pero también vale la pena mencionar que ha parcheado un mono un objeto incorporado, que es un gran no-no. Ver los comentarios sobre la respuesta de Abdennour TOUMI .
daemonexmachina