Come ottenere il subarray dall'array?


263

Ho var ar = [1, 2, 3, 4, 5]e voglio qualche funzione getSubarray(array, fromIndex, toIndex), quel risultato di chiamata getSubarray(ar, 1, 3)è nuovo array [2, 3, 4].


10
Hai provato a tagliare ?
Tom Knapen,

Risposte:


408

Date un'occhiata al 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);


22
Vale probabilmente la pena menzionare esplicitamente che l'originale arnon è modificato. console.log(ar); // -> [1, 2, 3, 4, 5]
daemonexmachina,

17

Per un semplice utilizzo di slice, usa la mia estensione per la classe di array:

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

Poi:

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

Test1 :

bigArr.subarray(1, -1);

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

test2:

bigArr.subarray(2, -2);

<["c", "fd"]

test3:

bigArr.subarray(2);

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

Potrebbe essere più facile per gli sviluppatori che provengono da un'altra lingua (ad esempio Groovy).



Cosa ha detto K_7; in particolar modo, rattoppare le scimmie con i Builtin (Object, Array, Promise, ecc.) è molto cattivo. Guarda il famoso esempio di MooTools forzando una ridenominazione del nativo proposto Array.prototype.containsin Array.prototype.includes.
daemonexmachina,

Per non parlare del fatto che il tuo subarraymetodo offre risultati inaspettati. bigArr.slice(1,-1)ritorna ['b','c','fd'], cosa che ti aspetteresti (-1 batte un elemento alla fine del nuovo array). Ma bigArr.subarray(1,-1)restituisce lo stesso di bigArr.subarray(1), vale a dire tutto dalla posizione 1 alla fine di bigArr. Stai anche forzando gli utenti a fornire sempre numeri negativi come endparametro. Qualsiasi end >= -1dà lo stesso risultato di quando end === undefined. D'altra parte, i bigArr.slice(1,3)ritorni ['b','c'], che è previsto di nuovo.
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);


non compila qui la correzione: var array_one = [11, 22, 33, 44,55]; var ar2 = array_one.slice (0, array_one.length-1); console.log (ar2)
bormat

0

La domanda è in realtà chiedere un nuovo array , quindi credo che una soluzione migliore sarebbe quella di combinare la risposta di Abdennour TOUMI con una funzione di clone:

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]


9
Non credo che quella fetta cambierà l'array originale.
Mani,

10
Array.prototype.slicerestituisce già una copia. Array.prototype.splicemodifica l'array originale.
Guido Bouman,

2
Il metodo slice () restituisce una copia superficiale di una porzione di un array in un nuovo oggetto array. Vedi Mozilla Developer Network . Downvoted.
TheCrazyProgrammer

Come altri hanno slicegià detto, restituisce già una copia superficiale, rendendo subarraysuperflua questa implementazione. Ma vale anche la pena ricordare che hai riparato una scimmia con un oggetto incorporato, che è un grande no-no. Vedi i commenti sulla risposta di Abdennour TOUMI .
daemonexmachina,
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.