Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions src/arrays.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,20 @@ const each = (elements, cb) => {
// This only needs to work with arrays.
// You should also pass the index into `cb` as the second argument
// based off http://underscorejs.org/#each
for (let i = 0; i < elements.length; i++) {
cb(elements[i], i);
}
};

const map = (elements, cb) => {
// Do NOT use .map, to complete this function.
// Produces a new array of values by mapping each value in list through a transformation function (iteratee).
// Return the new array.
const newArr = [];
for (let i = 0; i < elements.length; i++) {
newArr.push(cb(elements[i]));
}
return newArr;
};

const reduce = (elements, cb, startingValue) => {
Expand All @@ -28,26 +36,63 @@ const reduce = (elements, cb, startingValue) => {
// Elements will be passed one by one into `cb` along with the `startingValue`.
// `startingValue` should be the first argument passed to `cb` and the array element should be the second argument.
// `startingValue` is the starting value. If `startingValue` is undefined then make `elements[0]` the initial value.
const elementsCopy = elements.slice();
let memo = startingValue || elementsCopy.shift();
each(elementsCopy, (item) => {
memo = cb(memo, item);
});
};

const find = (elements, cb) => {
// Do NOT use .includes, to complete this function.
// Look through each value in `elements` and pass each element to `cb`.
// If `cb` returns `true` then return that element.
// Return `undefined` if no elements pass the truth test.
let test = false;
let index = 0;
for (let i = 0; i < elements.length; i++) {
if (cb(elements[i]) === true) {
test = true;
index = i;
}
}

if (test === true) {
return elements[index];
}
return 'undifined';
};

const filter = (elements, cb) => {
// Do NOT use .filter, to complete this function.
// Similar to `find` but you will return an array of all elements that passed the truth test
// Return an empty array if no elements pass the truth test
const newArr = [];
for (let i = 0; i < elements.length; i++) {
if (cb(elements[i]) === true) {
newArr.push(elements[i]);
}
return newArr;
}
};

/* STRETCH PROBLEM */

const flatten = (elements) => {
// Flattens a nested array (the nesting can be to any depth).
// Example: flatten([1, [2], [3, [[4]]]]); => [1, 2, 3, 4];
const res = [];
const func = (arr) => {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
func(arr[i]);
} else {
res.push(arr[i]);
}
}
};
func(elements);
return res;
};

/* eslint-enable no-unused-vars, max-len */
Expand Down
21 changes: 19 additions & 2 deletions src/callbacks.js
Original file line number Diff line number Diff line change
@@ -1,34 +1,51 @@
const firstItem = (arr, cb) => {
// firstItem passes the first item of the given array to the callback function.
const item = arr[0];
cb(item);
};

const getLength = (arr, cb) => {
// getLength passes the length of the array into the callback.
const length = arr.length;
cb(length);
};

const last = (arr, cb) => {
// last passes the last item of the array into the callback.
const lastItem = arr[arr.length - 1];
cb(lastItem);
};

const sumNums = (x, y, cb) => {
// sumNums adds two numbers (x, y) and passes the result to the callback.
// sumNums adds two numbers (x, y) and passes the result to the callback
const sum = x + y;
cb(sum);
};

const multiplyNums = (x, y, cb) => {
// multiplyNums multiplies two numbers and passes the result to the callback.
const prod = x * y;
cb(prod);
};

const contains = (item, list, cb) => {
// contains checks if an item is present inside of the given array/list.
// Pass true to the callback if it is, otherwise pass false.
let test = false;
for (let i = 0; i <= list.length; i++) {
if (item === list[i]) {
test = true;
}
}
cb(test);
};

/* STRETCH PROBLEM */

const removeDuplicates = (array, cb) => {
// removeDuplicates removes all duplicate values from the given array.
// Pass the duplicate free array to the callback function.
// Do not mutate the original array.
// Do not mutate the original array
};

/* eslint-enable */
Expand Down
16 changes: 16 additions & 0 deletions src/closure.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,28 @@ const counter = () => {
// Example: const newCounter = counter();
// newCounter(); // 1
// newCounter(); // 2
let count = 0;
return () => {
count++;
return count;
};
};

const counterFactory = () => {
// Return an object that has two methods called `increment` and `decrement`.
// `increment` should increment a counter variable in closure scope and return it.
// `decrement` should decrement the counter variable and return it.
let count = 0;
return {
increment: () => {
count++;
return count;
},
decrement: () => {
count--;
return count;
}
};
};

const limitFunctionCallCount = (cb, n) => {
Expand Down