Bagaimana cara mendapatkan subarray dari array?

263

Saya memiliki var ar = [1, 2, 3, 4, 5]dan menginginkan beberapa fungsi getSubarray(array, fromIndex, toIndex), hasil panggilan tersebut getSubarray(ar, 1, 3)adalah array baru [2, 3, 4].

Sergey Metlov
sumber
10
Sudahkah Anda mencoba irisan ?
Tom Knapen

Jawaban:

408

Melihat 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.
sumber
22
Mungkin layak disebutkan secara eksplisit di sini bahwa dokumen asli artidak dimodifikasi. console.log(ar); // -> [1, 2, 3, 4, 5]
daemonexmachina
17

Untuk penggunaan sederhana slice, gunakan ekstensi saya ke Kelas Array:

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

Kemudian:

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

Mungkin lebih mudah bagi pengembang yang datang dari bahasa lain (yaitu Groovy).

Abdennour TOUMI
sumber
Apa yang K_7 katakan; paling khusus, monyet-menambal Builtins (Object, Array, Promise, dll) sangat nakal. Lihat contoh terkenal Mootools memaksa mengubah nama yang diusulkan asli Array.prototype.containsuntuk Array.prototype.includes.
daemonexmachina
Belum lagi, subarraymetode Anda memberikan hasil yang tidak terduga. bigArr.slice(1,-1)mengembalikan ['b','c','fd'], yang Anda harapkan (-1 mengetuk satu elemen dari akhir array baru). Tetapi bigArr.subarray(1,-1)mengembalikan sama dengan bigArr.subarray(1), yang mengatakan semuanya dari posisi 1 sampai akhir bigArr. Anda juga memaksa pengguna untuk selalu memberikan angka negatif sebagai endparameter. Any end >= -1memberikan hasil yang sama seperti kapan end === undefined. Di sisi lain, bigArr.slice(1,3)pengembalian ['b','c'], yang lagi diharapkan.
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
sumber
itu tidak mengkompilasi di sini koreksi: var array_one = [11, 22, 33, 44,55]; var ar2 = array_one.slice (0, array_one.length-1); console.log (ar2)
bormat
0

The Pertanyaan sebenarnya meminta array yang baru , jadi saya percaya solusi yang lebih baik akan menggabungkan jawaban Abdennour Toumi ini dengan fungsi 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]

pengguna73362
sumber
9
Saya tidak berpikir irisan itu akan mengubah array asli.
Mani
10
Array.prototype.slicesudah mengembalikan salinan. Array.prototype.splicememodifikasi array asli.
Guido Bouman
2
Metode slice () mengembalikan salinan dangkal dari sebagian array ke objek array baru. Lihat Jaringan Pengembang Mozilla . Diturunkan.
TheCrazyProgrammer
Seperti yang orang lain katakan, slicesudah mengembalikan salinan yang dangkal, membuat subarrayimplementasi ini tidak perlu. Tetapi perlu juga disebutkan bahwa Anda telah menambal objek bawaan monyet, yang merupakan no-no besar. Lihat komentar pada jawaban Abdennour TOUMI .
daemonexmachina