1. Callback Metodu
Callback 4 tane parametre alabilir. Bunlar
şöyledir.
1.Accumulator (acc)
2.Current Value (cur)
3.Current Index (idx)
4.Source Array (src)
İ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.
1.1 accumulator + current value
Örnek
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.
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.