.Map, .every ve .forEach arasındaki fark nedir?


118

Aralarındaki farkın ne olduğunu hep merak etmişimdir. Hepsi aynı şeyi yapıyor gibi görünüyor ...


6
Birisi bir jQuery etiketi ekledi ... jQuery yöntemlerini göz önünde bulundurarak everyve forEachdeğil, sanırım sorunun jQuery ile herhangi bir şekilde ilgili olması olası değil. developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6
James Allardice

Bence bu bağlantı aradığınız cevaba sahip olmalı.
zBomb

Önceki yorumumdaki bağlantıda ayrıntılı olarak açıklanan yeni Mozilla'ya özgü dizi yöntemlerine atıfta bulunduğunuzu düşünürken haklı mıyım?
James Allardice

@James - Bunlar Mozilla'ya özgü değildir . Webkit ve opera dokümanları için de bir bağlantı paylaşırdım, ancak kafamın neresinde olduklarını bilmiyorum.
gilly3

@ gilly3 - Ahh, iyi nokta. Aşağıda değil, yalnızca IE9'da desteklendiklerine inanıyorum.
James Allardice

Yanıtlar:


224

Fark, dönüş değerlerindedir.

.map() orijinal öğe üzerinde bazı eylemler gerçekleştirilerek oluşturulan yeni bir nesne dizisi döndürür .

.every() mantıksal değer döndürür - bu dizideki her öğe sağlanan test işlevini karşılıyorsa true. Aradaki önemli bir fark .every(), dizideki her öğe için test işlevinin her zaman çağrılamayabilmesidir. Test işlevi herhangi bir öğe için yanlış döndürdüğünde, başka dizi öğesi yinelenmez. Bu nedenle, test işlevinin genellikle hiçbir yan etkisi olmamalıdır .

.forEach() hiçbir şey döndürmez - Dizideki her öğe için belirli bir eylemi gerçekleştiren Diziyi yineler.

MDN'de bunlar ve diğer birçok Dizi yineleme yöntemi hakkında bilgi edinin .


Alternatif olarak, MDN atıf olabilir
JoshWillik

3
@josh - MDN'den alıntı yaptım. Her yöntem adı, MDN'deki ilgili belgelerine bağlanır.
gilly3

@ gilly3, özür dilerim, mavi metni
parlattım

.forEach () şu anda yanlış bir şey döndürmüyor, belki 2012'de değildi ama 2015'te Chrome'da en azından arr2 = ['sue', 'joe', 'ben', 'guy', 'tom', 'jon ']; b = arr2.forEach (function (el, indx) {console.log (indx + ':' + el);}); console.log (b);
jason

1
@EugeneMercer "Orijinal öğe" ile dizinin her bir elemanının orijinal değerini kastediyorum.
gilly3

88

gilly3'ün cevabı harika. Diğer "döngü öğeleri" işlevleri hakkında biraz bilgi eklemek istedim.

  • .every() (yineleyici ilk kez yanlış veya yanlış bir şey döndürdüğünde döngüyü durdurur)
  • .some() (yineleyici doğru veya doğru bir şey döndürdüğünde ilk kez döngüyü durdurur)
  • .filter() (filtre işlevinin true döndürdüğü öğeleri içeren ve false döndürdüğü yerleri atlayan yeni bir dizi oluşturur)
  • .map() (yineleyici işlevi tarafından döndürülen değerlerden yeni bir dizi oluşturur)
  • .reduce() (yineleyiciyi tekrar tekrar çağırarak, önceki değerleri ileterek bir değer oluşturur; ayrıntılar için spesifikasyona bakın; bir dizinin içeriğini ve diğer birçok şeyi toplamak için kullanışlıdır)
  • .reduceRight() (azaltma gibi, ancak artan sırada değil, azalan şekilde çalışır)

kredi: TJCrowder JavaScript'teki bir dizi üzerinden her biri için?


Benden 100 beğeni alın!
Shamim

6

Yukarıdaki harika cevapların bir başka düşüncesi de zincirlemedir. ForEach () ile zincirleme yapamazsınız, ancak map () ile yapabilirsiniz.

Örneğin:

var arrayNumbers = [3,1,2,4,5];

arrayNumbers.map(function(i) {
    return i * 2
}).sort();

.forEach () ile .sort () yapamazsınız, bir hata alırsınız.


0

İçin Ramda arasındaki fark R.map()ve R.forEach()geçerli:

  1. R.forEach()orijinal diziyi R.map()döndürürken bir işlev döndürür
  2. R.forEach()yalnızca dizi üzerinde çalışabilir, ancak R.map()bir nesne üzerinde de çalışabilir (yani, nesnenin anahtar / değer çiftleri bir dizi gibi ele alınır)

Soru Javascript diliyle ilgili. Ramda harika iken tamamen farklı bir konu ve bir kütüphane.
SeaWarrior404
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.