-
Notifications
You must be signed in to change notification settings - Fork 0
/
reduce.js
52 lines (39 loc) · 1.51 KB
/
reduce.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// `Array#reduce` executes a callback for each element of an array just like our other methods. However,
// this callback also receives the current value of an "accumulator" and returns the new value of the accumulator.
// The idea with `reduce` is that you loop over an array and return a new, singular value.
// The signature of `reduce` is also a little different. It accepts a second argument for the default value of
// the accumulator.
// e.g. someArray.reduce((acc, element) => {}, defaultValue)
// The common example for `reduce` is returning the sum of an array of numbers. We go from a list of numbers down to
// one single number.
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, number) => acc + number, 0);
console.log(sum);
// Another common pattern is reducing to an arbitrary object that represents some aggregate data from
// the original array
const data = [
{ id: 1, name: "John" },
{ id: 2, name: "Jane" },
{ id: 3, name: "Joan J Jeffries" }
];
const stats = data.reduce(
(acc, record) => {
acc.ids.push(record.id);
const numJ = record.name
.split("")
.filter(letter => letter.toUpperCase() === "J").length;
acc.numJ = acc.numJ + numJ;
return acc;
},
{ ids: [], numJ: 0 }
);
console.log(stats);
// Write your own!
function myReduce(array, callback, defaultValue) {
let acc = defaultValue;
for (let i = 0; i < array.length; i++) {
acc = callback(acc, array[i], i);
}
return acc;
}
console.log(myReduce([1, 2, 3, 4], (acc, num) => acc + num, 0));