Cum să obțineți subarray din matrice? (Programare, Javascript, Array-Uri)

Serghei Metlov a intrebat.

Am var ar = [1, 2, 3, 4, 5] și vreau o funcție getSubarray(array, fromIndex, toIndex), că rezultatul apelului getSubarray(ar, 1, 3) este o nouă matrice [2, 3, 4].

Comentarii

  • Ați încercat slice? –  > Por Tom Knapen.
4 răspunsuri
Alex K.

Aruncați o privire la Array.slice(begin, end)

Comentarii

    35

  • Probabil că merită să menționăm explicit aici că originalul ar este nemodificat. console.log(ar); // -> [1, 2, 3, 4, 5] –  > Por daemonexmachina.
Abdennour TOUMI

Pentru o utilizare simplă a slice, utilizați extensia mea la clasa Array:

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

Apoi:

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”]

Ar putea fi mai ușor pentru dezvoltatorii care vin dintr-un alt limbaj (de exemplu, Groovy).

Comentarii

    16

  • Nu modificați obiecte care nu vă aparțin –  > Por Kartik Chugh.
  • Ceea ce a spus K_7; mai ales, monkey-patching-ul Builtins (Object, Array, Promise, etc.) este foarte obraznic. A se vedea celebrul exemplu de MooTools care forțează o redenumire a aplicației native propuse Array.prototype.contains în Array.prototype.includes. –  > Por daemonexmachina.
  • Ca să nu mai vorbim de subarray metoda oferă rezultate neașteptate. bigArr.slice(1,-1) returnează ['b','c','fd'], la care te-ai aștepta (-1 elimină un element de la sfârșitul noii matrice). Dar bigArr.subarray(1,-1) returnează același lucru ca și bigArr.subarray(1), ceea ce înseamnă că totul de la poziția 1 până la sfârșitul lui bigArr. De asemenea, îi forțați pe utilizatori să dea întotdeauna numere negative ca fiind end parametru. Orice end >= -1 dă același rezultat ca atunci când end === undefined. Pe de altă parte, bigArr.slice(1,3) returnează ['b','c'], ceea ce, din nou, este de așteptat. –  > Por daemonexmachina.
hannad rehman

Comentarii

  • nu se compilează aici corecția : var array_one = [11, 22, 33, 44,55]; var ar2 = array_one.slice(0, array_one.length-1); console.log(ar2) –  > Por bormat.
user73362

The întrebare solicită de fapt o Noua matrice, așa că eu cred că o soluție mai bună ar fi să combinăm răspunsul lui Abdennour TOUMI cu o funcție de clonare:

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

Comentarii

  • Nu cred că acea felie va schimba matricea originală. –  > Por Mani.
  • Array.prototype.slice returnează deja o copie. Array.prototype.splice modifică matricea originală. –  > Por Guido Bouman.
  • Metoda slice() returnează o copie superficială a unei porțiuni dintr-un array într-un nou obiect array. A se vedea Rețeaua de dezvoltare Mozilla. Votat în jos. –  > Por TheCrazyProgrammer.
  • Așa cum au spus și alții, slice returnează deja o copie superficială, ceea ce face ca acest subarray implementare inutilă. Dar merită menționat și faptul că ați maimuțărit un obiect builtin, ceea ce este o mare greșeală. Consultați comentariile la răspunsul lui Abdennour TOUMI. –  > Por daemonexmachina.