diziye birden çok öğeyi itme


284

Bir dizi olarak birden çok öğe itmeye çalışıyorum, ama hata alıyorum

> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined

Yakutta yapacağım benzer şeyleri yapmaya çalışıyorum, bunun applygibi bir şey olduğunu düşünüyordum *.

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]

Yanıtlar:


240

applyVeya ile nesnelerin çoğu işlevini kullanırken call, contextparametre üzerinde çalıştığınız nesne OLMALIDIR.

Bu durumda, ihtiyacınız a.push.apply(a, [1,2])(veya daha doğru Array.prototype.push.apply(a, [1,2]))


618

Bir diziye birden çok öğeyi aşağıdaki şekilde aktarabilirsiniz

var a = [];
    
a.push(1, 2, 3);

console.log(a);


1
Bu cevap ve seçilen cevap farklı ve belki de beklenmedik sonuçlar doğurur. a.push (1) ile a.push ([1])
oevna

1
Herkes bunun neden kabul edilen cevaptan daha fazla oy verdiğini açıklayabilir mi? Daha kolay olabilir, ancak daha az esnektir. 2 diziyi birleştirmek istiyorsanız, bu işe yaramaz.
BluE

İki diziyi birleştirmek istiyorsanız @ array.concat () kullanın
Florent Arlandis

@FlorentArlandis array.concat ilk diziye ikinci diziyi eklemek için çalışmaz. Yeni bir tane yaratacaktır. Benzer olduğunu biliyorum. Forma operatörü aradığım şeydi. Ayrıntılar için diğer cevaplara ve yorumlara bakın.
BluE

435

Şimdi ECMAScript2015'te (diğer adıyla ES6), aynı anda birden çok öğe eklemek için forma operatörünü kullanabilirsiniz :

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);

Bkz Kangax en ES6 uyumluluğu tarayıcılar uyumlu olduğunu görmek için tabloyu


41
whaaaaaaat bu harika, artı, eğer daktiloda yaparsanız push.apply için derleyecektir, bu yüzden geriye dönük uyumluluk var
Chris

72

Şunları kullanabilirsiniz Array.concat:

var result = a.concat(b);

16
Array.prototype.concat yeni dizi döndürür.
suricactus

12
Mevcut diziye zorlamak istiyor, bu yüzden Array.prototype.push.apply(arr1, arr2)doğru cevap, çünkü arr1.concat(arr2)siz yeni bir dizi oluşturuyorsunuz.
suricactus

3
@suricactus arr1 = arr1.concat(arr2)çok önemli değil ve çok daha temiz görünüyor. Eski diziye geçmek veya eski diziyi yenisiyle değiştirmek ihtiyaçlarınıza bağlıdır. Eski diziye iten 10m + elemanlarla uğraşırsanız daha hızlı çalışır, küçük parçaları yönetirseniz hızda neredeyse hiçbir fark bulmazsınız. Her iki seçenek de tamamen yasal.
VisioN

5
@YuvalA. prototype.push.applysadece bir pushkez arar . Ve yukarıdaki ayrım hızla ilgili değil, yerinde bir işlemle yeni bir dizi oluşturma arasında gerekli. Bir dizi alan ve yerinde değiştirmesi gereken bir yöntemim olsaydı ne olurdu? concatO fonksiyonun arayan için değişken değiştirmez olarak yöntem hatta VisionN koduna sahip çalışamaz.
coderforlife

1
a = a.concat(b)hala daha kısa bir sözdizimiArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi

22

Array.concatECMAScript 2015'te (ES6, ES2015 olarak da bilinir), diziyi değiştirmeyen ancak yeni bir dizi döndüren bir alternatif istiyorsanız , yayma işlecini şu şekilde kullanabilirsiniz :

var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);

Yöntem diziyi değiştirdiğinde / değiştirdiğinden, bu pushyöntemden farklıdır push.

Tarayıcınızda belirli ES2015 özelliklerinin çalışıp çalışmadığını görmek istiyorsanız Kangax'ın uyumluluk tablosunu kontrol edin .

Tarayıcı desteğini beklemek istemiyorsanız ve ES2015'i üretimde kullanmak istiyorsanız Babel veya benzeri bir transpiler de kullanabilirsiniz .


4

Birçok cevaplar kullanımına tavsiye vardır: Array.prototype.push(a, b). Bu güzel bir yol, ama gerçekten büyük b olacak, yığın taşma hatası (çok fazla argüman nedeniyle) olacak. Burada dikkatli ol.

Bkz. N dizilerini birleştirmenin en etkili yolu nedir? daha fazla ayrıntı için.


3
Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın. [İyi bir cevabı nasıl yazarım? ] ( stackoverflow.com/help/how-to-answer )
mrun

1
Üzgünüm, cevapları altında yorum yapamıyorum (kendim hariç) çünkü yeterli itibar :). Ancak tam bir genel bakış için burada belirtilmelidir. Lütfen benim için yapabilir misin? Sonra cevabımı kaldıracağım.
12kb

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.