TL; DR, başlangıç değerini ayarlayın
kullanılması strüktür
arr.reduce( ( sum, { x } ) => sum + x , 0)
Yıkmadan
arr.reduce( ( sum , cur ) => sum + cur.x , 0)
Daktilo Yazısı ile
arr.reduce( ( sum, { x } : { x: number } ) => sum + x , 0)
Yıkım yöntemini deneyelim:
const arr = [ { x: 1 }, { x: 2 }, { x: 4 } ]
const result = arr.reduce( ( sum, { x } ) => sum + x , 0)
console.log( result ) // 7
Bunun anahtarı başlangıç değerini belirlemektir. Dönüş değeri, bir sonraki yinelemenin ilk parametresi olur.
Üst cevapta kullanılan teknik deyimsel değil
Kabul edilen cevap "isteğe bağlı" değeri geçmemeyi önerir. Deyimsel yol her zaman ikinci parametrenin zaman dahil edilmesidir. Neden? Üç neden:
1. Tehlikeli
- Başlangıç değerinden geçmemek tehlikelidir ve geri arama işlevi dikkatsizse yan etkiler ve mutasyonlar oluşturabilir.
Seyretmek
const badCallback = (a,i) => Object.assign(a,i)
const foo = [ { a: 1 }, { b: 2 }, { c: 3 } ]
const bar = foo.reduce( badCallback ) // bad use of Object.assign
// Look, we've tampered with the original array
foo // [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]
Ancak bunu ilk değeriyle bu şekilde yapmış olsaydık:
const bar = foo.reduce( badCallback, {})
// foo is still OK
foo // { a: 1, b: 2, c: 3 }
Kayıt için, orijinal nesneyi değiştirmeyi düşünmüyorsanız, ilk parametresini Object.assign
boş bir nesneye ayarlayın. Bunun gibi:Object.assign({}, a, b, c)
.
2 - Daha İyi Tür Çıkarımı -
Typescript gibi bir araç veya VS Code gibi bir düzenleyici kullanırken, derleyiciye baş harfini söylemenin avantajını elde edersiniz ve yanlış yaparsanız hataları yakalayabilirsiniz. Başlangıç değerini ayarlamazsanız, birçok durumda tahmin edemeyebilirsiniz ve ürpertici çalışma zamanı hatalarıyla sonuçlanabilirsiniz.
3 - Functorlara Saygı
- İç işlevsel çocuğu serbest bırakıldığında JavaScript en iyi şekilde parlar. İşlevsel dünyada, reduce
bir diziyi nasıl "katladığınız" konusunda bir standart vardır . Bir katamorfizma katladığınızda veya uyguladığınızda , yeni bir tür oluşturmak için bu dizinin değerlerini alırsınız. Ortaya çıkan türü bildirmeniz gerekir - son tür dizideki, başka bir dizideki veya başka bir türdeki değerlerde olsa bile bunu yapmalısınız.
Bunu başka bir şekilde düşünelim. JavaScript'te, işlevler veri gibi dolaşabilir, geri aramalar bu şekilde çalışır, aşağıdaki kodun sonucu nedir?
[1,2,3].reduce(callback)
Bir sayı döndürecek mi? Bir obje? Bu daha net hale getirir
[1,2,3].reduce(callback,0)
Fonksiyonel programlama spesifikasyonu hakkında daha fazla bilgiyi buradan edinebilirsiniz: https://github.com/fantasyland/fantasy-land#foldable
Biraz daha arka plan
reduce
Yöntem, iki parametre alır
Array.prototype.reduce( callback, initialItem )
callback
İşlev aşağıdaki parametreleri alır
(accumulator, itemInArray, indexInArray, entireArray) => { /* do stuff */ }
İlk yineleme için,
Sağlanırsa initialItem
, reduce
işlev dizinin . Öğesini ve dizinin ilk öğesini initialItem
olarak geçer .accumulator
itemInArray
Eğer initialItem
bir değil mesafede, reduce
işlev olarak dizideki ilk madde geçer initialItem
ve benzeri gibi bir dizi ikinci ürünün itemInArray
davranışı kafa karıştırıcı olabilir.
Her zaman azaltmanın başlangıç değerini ayarlamayı öğretir ve öneririm.
Dokümanlara şu adresten bakabilirsiniz:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
Bu yardımcı olur umarım!
arr.reduce(function(a,b){return a + b})
ikinci örnekte kastettiğini düşünüyorum .