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


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);


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).



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);


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]


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.