Giriş
İki tane parametre alır. Callback ve InitialValue. Callback mutlaka verilmek zorunda, InitialValue verilmek zorunda değil. Bu durumda ilk Callback 1 ve 2. nesneler ile çağrılır.
Örnek
İki tane parametre alır. Callback ve InitialValue. Callback mutlaka verilmek zorunda, InitialValue verilmek zorunda değil. Bu durumda ilk Callback 1 ve 2. nesneler ile çağrılır.
Örnek
reduce() işlemine giren dizide tek eleman varsa, o değer sonuç olarak döner.Açıklaması şöyle.
Şöyle yaparız.If the array has only one element (regardless of position) and no initialValue was provided, or if initialValue is provided but the array is empty, the solo value would be returned without calling callback.
// 1
[1,2,3,4,5].filter(x => x==3).reduce((x, y) => y) // -> 3, all good
// 2
[1,2,3,4,5].filter(x => x<=3).reduce((x, y) => 0) // -> 0, still good
// 3
[1,2,3,4,5].filter(x => x==3).reduce((x, y) => 0) // -> 3, hello?
1. Callback Metodu
Callback 4 tane parametre alabilir. Bunlar şöyledir.
1.Accumulator (acc)İlk parametre accumulator olarak adlandırılır. Bu aslında dictionary nesnesidir. Bu metod nesneyi belirli bir alana göre gruplamak için kullanışlı. Java'daki groupingBy() metodu gibi kullanılabilir.
2.Current Value (cur)
3.Current Index (idx)
4.Source Array (src)
1.1 accumulator + current value
Elimizde şöyle bir kod olsun. Aynı date alanına sahip nesneleri gruplar. Her gruba id alanını ekler.
let input=[{date:{day:27,month:1,year:2020},id:3},{date:{day:28,month:1,year:2020},id:4},
{date:{day:31,month:1,year:2020},id:5},{date:{day:1,month:2,year:2020},id:6},
{date:{day:2,month:2,year:2020},id:7}];
/* Convert the dictionary that will be created by reduce to a value array */
var output = Object.values(input.reduce((dict, item) => {
const { date, id } = item;
/* The distinct key for this item based on month/year of date field */
const key = `${date.month}-${date.year}`;
/* Check if dictionary already has an object value for key. This short hand
will only insert a new object value for key, if one does not already exist
in the dictionary */
const value = dict[key] || { month : date.month, year : date.year, id : [] };
/* Add the item id to the dictionary entries id array */
value.id.push(id);
/* Update value object for key */
return { ...dict, [key] : value };
}, {}))
console.log(output);
Çıktı olarak şunu alırız.0:
result: {month: 1, year: 2020, id:[3,4,5]}
1:
result: {month: 2, year: 2020, id:[6,7]}
Örnek - accumulator + current valueŞöyle yaparız. Accumulator içinde değer olup olmadığını kontrol etmek için [] kullanılır.
const data = [{"modelNumber":"123456789","balance":{"amount":1000,"currency":"EUR"}},
{"modelNumber":"987654321","balance":{"amount":2000,"currency":"EUR"}},
... ];
const result = Object.values(data.reduce((r, { balance }) => {
const { amount, currency } = balance;
if(!r[currency])
r[currency] = { currency, amount: 0 };
r[currency].amount += amount;
return r;
}, {}));
console.log(result);
Örnek - accumulator + current valueŞöyle yaparız. Accumulator içinde değer olup olmadığını kontrol etmek için [] kullanılır.
const data = [
{email: '100@email.com', amount: '30', date: '2018-12'},
{email: '100@email.com', amount: '30', date: '2018-11'},
{email: '100@email.com', amount: '30', date: '2018-10'},
{email: '200@email.com', amount: 0, date: '2018-12'},
{email: '200@email.com', amount:'30', date: '2018-11'},
{email: '200@email.com', amount:'30', date: '2018-10'},
{email: '200@email.com', amount:'30', date: '2018-09'},
{email: '200@email.com', amount:'25', date: '2018-08'},
{email: '200@email.com', amount:'25', date: '2018-08'},]
let result = data.reduce((acc, {email, date, amount}) => {
if (!acc[email]) acc[email] = { email };
acc[email][date] = amount;
return acc;
}, {});
console.log(Object.values(result));
Çıktı olarak şunu alırız.const data = [
{
email: '100@email.com',
'2018-12': '30',
'2018-11': '30',
'2018-10': '30',
'2018-09': 0,
'2018-08': 0,
'2018-07': 0,
'2018-06': 0,
'2018-05': 0,
'2018-04': 0,
'2018-03': 0,
'2018-02': 0,
'2018-01': 0,
'2017-12': 0,
},
{
email: '200@email.com',
'2018-12':0,
'2018-11':'30',
'2018-10':'30',
'2018-09':'30',
'2018-08':'25',
'2018-07': 0,
'2018-06': 0,
'2018-05': 0,
'2018-04': 0,
'2018-03': 0,
'2018-02': 0,
'2018-01': 0,
'2017-12': 0,
}]
Örnek - accumulator + current value
Şöyle yaparız. Accumulator içinde değer olup olmadığını kontrol etmek için in kullanılır.
Örnek - accumulator + current value + index
Şöyle yaparız.
2. InitialValueŞöyle yaparız. Accumulator içinde değer olup olmadığını kontrol etmek için in kullanılır.
const arr = [
['Deer Skin', 1],
['Bear Skin', 1],
['Deer Skin', 1],
['Cougar Skin', 2]
];
const res = arr.reduce((acc, elem) => {
elem[0] in acc ? acc[elem[0]] += elem[1] : acc[elem[0]] = elem[1];
return acc;
}, {});
console.log(res);
Çıktı olarak şunu alırız.[ {name: 'Deer Skin', quantity: 4},
{name: 'Bear Skin', quantity: 5},
{name: 'Cougar Skin', quantity: 4} ... ]
1.2 accumulator + current value + indexÖrnek - accumulator + current value + index
Şöyle yaparız.
let arr = [
["Jessica", "Ashley", "Emily", "Samantha", "Sarah", "Taylor"],
["Samantha", "Sarah", "Taylor", "Hannah", "Brittany", "Amanda"]
]
let lookup = arr[0].reduce((lookup, name, index) => {
lookup[name] = index
return lookup
}, {})
Callback'e geçilecek ilk değerdir.
Örnek - Initial Value Verilmiyor
Açıklaması şöyle. Eğer Initial Value verilmezse ve dizi boş ise hata (runtime error) alırız.
When you don't supply an initial value for the accumulator, the first call to your callback receives the first entry as the first argument and the second as the second.
Elimizde şöyle bir kod olsun. Çıktı olarak -36 alırız. Çünkü ilk çağrı 5,10 değerleri ile olur
const number = [5, 10, 13, 18];
var x = number.reduce((accumulator, currentValue) =>{return accumulator - currentValue});
console.log(x);
ÖrnekŞöyle yaparız
function getSum(total, num) {
return total + num;
}
var tempvalue = [...];
console.log('array', tempvalue);
console.log('total', tempvalue.reduce(getSum,0));
Hiç yorum yok:
Yorum Gönder