Diziden alt dizi nasıl alınır?


263

Ben var ar = [1, 2, 3, 4, 5]ve bazı fonksiyon istiyorum getSubarray(array, fromIndex, toIndex), bu çağrı sonucu getSubarray(ar, 1, 3)yeni dizi [2, 3, 4].


10
Dilim denedin mi?
Tom Knapen

Yanıtlar:


408

Şuna baksana 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
Muhtemelen burada orijinalin ardeğiştirilmediğinden açıkça bahsetmeye değer . console.log(ar); // -> [1, 2, 3, 4, 5]
daemonexmachina

17

Basit bir kullanımı için slice, uzantıyı Array Class'a kullanın:

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

Sonra:

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

Başka bir dilden (yani Groovy) gelen geliştiriciler için daha kolay olabilir.



K_7'nin söyledikleri; en önemlisi, Yerleşiklerin maymun yaması (Nesne, Dizi, Söz, vb.) çok yaramaz. Ünlü örneğe bakın bir yeniden adlandırma zorlayarak mooTools teklif edilen yerel bir Array.prototype.containsetmek Array.prototype.includes.
daemonexmachina

Bahsetmemek gerekirse, subarrayyönteminiz beklenmedik sonuçlar verir. beklediğiniz bigArr.slice(1,-1)döndürür ['b','c','fd'](-1, yeni dizinin sonundaki bir öğeyi çalar). Fakat bigArr.subarray(1,-1)döner aynı bigArr.subarray(1)söylemek olan her şeyi sonuna kadar pozisyon 1'den bigArr. Ayrıca, kullanıcıları endparametre olarak her zaman negatif sayılar vermeye zorlarsınız . Herhangi biri end >= -1ne zaman aynı sonucu verir end === undefined. Öte yandan, yine beklenen , bigArr.slice(1,3)döner ['b','c'].
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);


burada düzeltmeyi derlemez: var array_one = [11, 22, 33, 44,55]; var ar2 = dizi_birisi.slice (0, dizi_birim.length-1); console.log (ar2)
bormat

0

Sorusu aslında bir istiyor Yeni dizinin ben daha iyi bir çözüm birleştirmek olacağına inanıyorum bu yüzden, Abdennour TOUMI yanıtını bir klon fonksiyonu ile:

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
Ben dilim orijinal dizi değişecek sanmıyorum.
Mani

10
Array.prototype.slicezaten bir kopyasını döndürür. Array.prototype.spliceorijinal diziyi değiştirir.
Guido Bouman

2
Slice () yöntemi, bir dizinin bir bölümünün sığ bir kopyasını yeni bir dizi nesnesine döndürür. Bkz. Mozilla Geliştirici Ağı . Downvoted.
TheCrazyProgrammer

Diğerlerinin söylediği gibi, slicezaten sığ bir kopya döndürerek bu subarrayuygulamayı gereksiz kılıyor . Ama aynı zamanda büyük bir hayır-hayır olan yerleşik bir nesneyi maymunla yamaladığınızı da belirtmek gerekir. Abdennour TOUMI'nin cevabı hakkındaki yorumlara bakın .
daemonexmachina
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.