Skip to content

Commit e4a9206

Browse files
committed
rough 07-reduce created
1 parent 0758535 commit e4a9206

File tree

6 files changed

+224
-4
lines changed

6 files changed

+224
-4
lines changed

tutorial/1/07/01-reduce.spec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"use strict";
2+
var chai = require('chai');
3+
var expect = chai.expect;
4+
var spies = require('chai-spies');
5+
chai.use(spies);
6+
var path = require('path');
7+
var loadJS = require('../../common/loadJS').default;
8+
9+
describe('var total', function() {
10+
11+
it('should call reduce', function() {
12+
var spy = chai.spy.on(Array, 'reduce');
13+
loadJS('07-reduce.js');
14+
expect(spy).to.have.been.called();
15+
});
16+
17+
it('should add the numbers up', function () {
18+
expect(total).to.equal(54);
19+
});
20+
21+
});

tutorial/1/07/02-reduce.spec.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use strict";
2+
var chai = require('chai');
3+
var expect = chai.expect;
4+
var spies = require('chai-spies');
5+
chai.use(spies);
6+
var path = require('path');
7+
var loadJS = require('../../common/loadJS').default;
8+
9+
loadJS('07-reduce.js');
10+
11+
describe('var averages', function() {
12+
13+
it('should calculate the average of each class', function () {
14+
let averages = data.map(function(course) {
15+
var sum = course.students.reduce(function(total, student) {
16+
total += student.score;
17+
return total;
18+
}, 0);
19+
return Math.round(sum / course.students.length, 0);
20+
});
21+
expect(averages).to.deep.equal([57, 67, 70, 70, 71, 62, 67, 73, 62, 57]);
22+
});
23+
});

tutorial/1/07/03-reduce.spec.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"use strict";
2+
var chai = require('chai');
3+
var expect = chai.expect;
4+
var spies = require('chai-spies');
5+
chai.use(spies);
6+
var path = require('path');
7+
var loadJS = require('../../common/loadJS').default;
8+
9+
loadJS('07-reduce.js');
10+
11+
describe('var suspectScores', function() {
12+
13+
it('should reduce to an array of suspect scores', function() {
14+
15+
// var suspects = ['Hack Kerr', 'Kevin Mitnick', 'Albert Gonzalez'];
16+
// var suspectData = data.map(function(course) {
17+
// return course.students.filter(function(student) {
18+
// return suspects.indexOf(student.name) > -1;
19+
// });
20+
// }).concatAll()
21+
// .reduce(function(prev, curr) {
22+
// let index = prev.findIndex(function(item) {
23+
// return item.name === curr.name;
24+
// });
25+
// if (index < 0) {
26+
// prev.push({
27+
// name: curr.name,
28+
// scores: [].concat(curr.score)
29+
// });
30+
// } else {
31+
// prev[index].scores.push(curr.score);
32+
// }
33+
// return prev;
34+
// }, []);
35+
36+
37+
expect(suspectScores).to.deep.equal([{
38+
name: 'Albert Gonzalez',
39+
scores: [35, 37, 73, 74, 94, 67, 39, 70, 56, 52]
40+
}, {
41+
name: 'Hack Kerr',
42+
scores: [85, 86, 92, 75, 83, 96, 94, 87, 89, 102]
43+
}, {
44+
name: 'Kevin Mitnick',
45+
scores: [72, 52, 47, 89, 47, 75, 81, 41, 40, 37]
46+
}]);
47+
});
48+
49+
});

tutorial/1/07/04-reduce.spec.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"use strict";
2+
var chai = require('chai');
3+
var expect = chai.expect;
4+
var spies = require('chai-spies');
5+
chai.use(spies);
6+
var path = require('path');
7+
var loadJS = require('../../common/loadJS').default;
8+
9+
loadJS('07-reduce.js');
10+
11+
describe('var suspectScores', function() {
12+
13+
it('should map over suspect data to find the score differences', function() {
14+
var suspectData = [{
15+
name: 'Albert Gonzalez',
16+
scores: [35, 37, 73, 74, 94, 67, 39, 70, 56, 52]
17+
}, {
18+
name: 'Hack Kerr',
19+
scores: [85, 86, 92, 75, 83, 96, 94, 87, 89, 102]
20+
}, {
21+
name: 'Kevin Mitnick',
22+
scores: [72, 52, 47, 89, 47, 75, 81, 41, 40, 37]
23+
}];
24+
var averages = [57, 67, 70, 70, 71, 62, 67, 73, 62, 57];
25+
26+
var change = suspectData.map(function(suspect) {
27+
return {
28+
name: suspect.name,
29+
scores: suspect.scores,
30+
change: suspect.scores.reduce(function(a, b, index) {
31+
a += b - averages[index];
32+
return a;
33+
}, 0)
34+
};
35+
});
36+
expect(change).to.deep.equal([{
37+
name: 'Albert Gonzalez',
38+
scores: [35, 37, 73, 74, 94, 67, 39, 70, 56, 52],
39+
change: -59
40+
}, {
41+
name: 'Hack Kerr',
42+
scores: [85, 86, 92, 75, 83, 96, 94, 87, 89, 102],
43+
change: 233
44+
}, {
45+
name: 'Kevin Mitnick',
46+
scores: [72, 52, 47, 89, 47, 75, 81, 41, 40, 37],
47+
change: -75
48+
}]);
49+
});
50+
51+
});

tutorial/1/07/05-reduce.spec.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"use strict";
2+
var chai = require('chai');
3+
var expect = chai.expect;
4+
var spies = require('chai-spies');
5+
chai.use(spies);
6+
var path = require('path');
7+
var loadJS = require('../../common/loadJS').default;
8+
9+
loadJS('07-reduce.js');
10+
11+
describe('var likelySuspect', function() {
12+
13+
it('should reduce down to a suspect name', function () {
14+
expect(likelySuspect).to.equal('Hack Kerr');
15+
});
16+
});

tutorial/1/07/reduce.md

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,77 @@
11
### reduce
22
Array -> transform into anything
33

4+
```js
5+
function add(prev, curr) {
6+
console.log(`add(${prev}, ${curr}) -> ${prev + curr}`)
7+
return prev + curr;
8+
}
49

10+
[1, 5, 10].reduce(add, 100); // initial value
511

6-
+ Use `reduce` to calculate the class average
12+
// add(100, 1) -> 101
13+
// add(101, 5) -> 106
14+
// add(106, 10) -> 116
15+
//> 116
16+
```
17+
18+
19+
20+
+ Use `reduce` to sum the numbers in the `practice` array
721
@test('1/07/01-reduce')
822
@action(open('07-reduce.js'))
23+
@action(set(
24+
```
25+
var practice = [1, 1, 2, 3, 5, 8, 13, 21];
926
10-
+ `reduce` to suspect scores
27+
// total the numbers using a reduce function
28+
// hint: start at 0
29+
var total = practice.reduce();
30+
```
31+
))
32+
33+
+ `map` over each course and use `reduce` to calculate the class averages for each class. Set `averages` to the resulting array of all class averages.
1134
@test('1/07/02-reduce')
35+
@action(insert(
36+
```
37+
// Remember, an average is the sum of all student scores divided by the number of students
38+
// set the result to an array, for example: [50, 65, 75, 85, ...];
39+
var averages = courses.reduce();
40+
```
41+
))
1242

13-
+ `map` over suspect data to find the score differences
43+
+ `reduce` to an array of suspect scores
1444
@test('1/07/03-reduce')
45+
@action(insert(
46+
```
47+
48+
// [{ name: 'suspectName', scores: [ 50, 65, 75, 85...] }, ... ]
49+
var suspectScores = courses.reduce();
50+
```
51+
))
1552

16-
+ `reduce` down to likely suspect names
53+
+ `map` over suspect data to find the `"difference"` from subtracting the students score from the average score. Add this to `suspectScores` using the key `difference`. The resulting array should look like this:
54+
```js
55+
[{
56+
name: 'suspectName',
57+
scores: [50, 65, 75, 85...],
58+
difference: 15
59+
}]
60+
```
1761
@test('1/07/04-reduce')
62+
63+
64+
+ `reduce` down to any likely suspect names by filtering with the `isCheater` function
65+
@test('1/07/05-reduce')
66+
@action(insert(
67+
```
68+
69+
function isCheater(suspect) {
70+
return suspect.difference > 200;
71+
}
72+
73+
// reduce down to a string of likely suspects
74+
var likelySuspect = suspectScores.reduce().join(', ');
75+
console.log(likelySuspect);
76+
```
77+
))

0 commit comments

Comments
 (0)