-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchallenges-01.test.js
More file actions
234 lines (183 loc) · 8.26 KB
/
challenges-01.test.js
File metadata and controls
234 lines (183 loc) · 8.26 KB
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
'use strict';
/* ------------------------------------------------------------------------------------------------
CHALLENGE 1
Write a function named greeting that takes in a string and returns the string in all uppercase letters.
Then, write a function named speaker that takes in a string and a callback function. The speaker function should return the string in all uppercase letters only by invoking the callback.
------------------------------------------------------------------------------------------------ */
const greeting = (word) => {
return word.toUpperCase();
};
const speaker = (message, callback) => {
return callback(message);
};
/* ------------------------------------------------------------------------------------------------
CHALLENGE 2
Write a function named addValues that takes in an array and a value and pushes the value into the array. This function does not need a return statement.
Then, write a function named addNumbers that takes in four arguments:
- A number to be added to an array
- An array into which the number should be added
- The number of times the number should be added
- A callback function to use to add the numbers to the array (Hint: you already defined it)
Within the addNumbers function, invoke the callback function as many times as necessary, based on the third argument of the addNumbers function.
Return the modified array.
------------------------------------------------------------------------------------------------ */
const addValues = (arr, value) => arr.push(value);
const addNumbers = (num, arr, times, callback) => {
for (let i = 0; i < times; i++) callback(arr, num);
return arr;
};
/* ------------------------------------------------------------------------------------------------
CHALLENGE 3
Write a function named removeOne that takes in a number and an array. If the number divided by three has a remainder of two, pop one element off of the array.
Hint: you may want to look into the modulo operation.
Then, write a function named removeElements that takes in an array and a callback. This function should use a for loop to iterate over the array and invoke the callback once for each element in the array.
Return the modified array.
------------------------------------------------------------------------------------------------ */
const removeOne = (num, arr) => {
if (num % 3 === 2) arr.pop();
};
const removeElements = (arr, callback) => {
for (let i = 0; i < arr.length; i++) {
callback(arr[i], arr);
}
return arr;
};
/* ------------------------------------------------------------------------------------------------
CHALLENGE 4
Write a function named removeWithForEach that produces the same output as challenge 3, but uses forEach.
------------------------------------------------------------------------------------------------ */
const removeWithForEach = (arr, callback) => {
arr.forEach((value) => callback(value, arr));
return arr;
};
/* ------------------------------------------------------------------------------------------------
CHALLENGE 5
Write a function named removeWithAnon that produces the same output as challenges 3 and 4.
This function should use forEach again, but rather than taking in a callback as an argument, define an anonymous function as the argument to forEach.
This anonymous function should accept up to three arguments: the element, the index, and the array.
------------------------------------------------------------------------------------------------ */
const removeWithAnon = (arr) => {
arr.forEach((value) => {
if (value % 3 === 2) arr.pop();
});
return arr;
};
/* ------------------------------------------------------------------------------------------------
CHALLENGE 6
Write a function named createList that takes in an array of the current store intentory.
The inventory is formatted like this:
[
{ name: 'apples', available: true },
{ name: 'pears', available: true },
{ name: 'oranges', available: false },
{ name: 'bananas', available: true },
{ name: 'blueberries', available: false }
]
This function should use forEach to populate your grocery list based on the store's inventory. If the item is available, add it to your list. Return the final list.
------------------------------------------------------------------------------------------------ */
const createList = (availableItems) => {
let list = [];
availableItems.forEach((element) => {
if (element.available) list.push(element.name);
});
return list;
};
/* ------------------------------------------------------------------------------------------------
CHALLENGE 7
Write a function named fizzbuzz that takes in an array of numbers.
Iterate over the array using forEach to determine the output based on several rules:
- If a number is divisible by 3, add the word "Fizz" to the output array.
- If the number is divisible by 5, add the word "Buzz" to the output array.
- If the number is divisible by both 3 and 5, add the phrase "Fizz Buzz" to the output array.
- Otherwise, add the number to the output array.
Return the resulting output array.
------------------------------------------------------------------------------------------------ */
const fizzbuzz = (arr) => {
let outputArray = [];
arr.forEach((element) => {
let three = element % 3 === 0;
let five = element % 5 === 0;
if (three && five) {
outputArray.push('Fizz Buzz');
} else if (three) {
outputArray.push('Fizz');
} else if (five) {
outputArray.push('Buzz');
} else {
outputArray.push(element);
}
});
return outputArray;
};
/* ------------------------------------------------------------------------------------------------
TESTS
All the code below will verify that your functions are working to solve the challenges.
DO NOT CHANGE any of the below code.
Run your tests from the console: jest challenges-01.test.js
------------------------------------------------------------------------------------------------ */
describe('Testing challenge 1', () => {
test('It should return the message with all uppercase characters', () => {
expect(speaker('hello 301 students!', greeting)).toStrictEqual('HELLO 301 STUDENTS!');
});
});
describe('Testing challenge 2', () => {
test('It should add the number 8 to the array five times', () => {
expect(addNumbers(8, [], 5, addValues)).toStrictEqual([8, 8, 8, 8, 8]);
expect(addNumbers(8, [], 5, addValues).length).toStrictEqual(5);
});
});
describe('Testing challenge 3', () => {
test('It should remove three elements from the array', () => {
expect(removeElements([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], removeOne)).toStrictEqual([1, 2, 3, 4, 5, 6, 7]);
expect(removeElements([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], removeOne).length).toStrictEqual(7);
});
});
describe('Testing challenge 4', () => {
test('It should remove three elements from the array', () => {
expect(removeWithForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], removeOne)).toStrictEqual([1, 2, 3, 4, 5, 6, 7]);
expect(removeWithForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], removeOne).length).toStrictEqual(7);
});
});
describe('Testing challenge 5', () => {
test('It should remove three elements from the array', () => {
expect(removeWithAnon([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])).toStrictEqual([1, 2, 3, 4, 5, 6, 7]);
expect(removeWithAnon([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).length).toStrictEqual(7);
});
});
describe('Testing challenge 6', () => {
const inventory = [
{ name: 'apples', available: true },
{ name: 'pears', available: true },
{ name: 'oranges', available: false },
{ name: 'bananas', available: true },
{ name: 'blueberries', available: false },
];
test('It should only add the available items to the list', () => {
expect(createList(inventory)).toStrictEqual(['apples', 'pears', 'bananas']);
expect(createList(inventory).length).toStrictEqual(3);
});
});
describe('Testing challenge 7', () => {
const inputs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
test('It should print out messages or numbers', () => {
expect(fizzbuzz(inputs)).toStrictEqual([
1,
2,
'Fizz',
4,
'Buzz',
'Fizz',
7,
8,
'Fizz',
'Buzz',
11,
'Fizz',
13,
14,
'Fizz Buzz',
16,
]);
expect(fizzbuzz(inputs).length).toStrictEqual(16);
});
});