JavaScript Fundamentals for Functional Programming v3
Hi,
I'm
Bianca
andcoffee.io
...but it will prepare you well if you decide to take the next step in that journey and most importantly, it will make you a more confident and capable JavaScript programmer.
This course is not about functional programming
MONAD
IDEMPOTENT
REFERENTIAL TRANSPARENCY
POINTED FUNCTOR
LAMBDA CALCULUS
ENDOMORPHISM
SETOID
COMONAD
POINT FREE STYLE
BEFORE
MONAD
IDEMPOTENT
REFERENTIAL TRANSPARENCY
POINTED FUNCTOR
LAMBDA CALCULUS
ENDOMORPHISM
SETOID
COMONAD
POINT FREE STYLE
AFTER
AFTER
SCOPE
CURRYING
CALLBACKS
HIGHER-ORDER FUNCTIONS
PARAMETERS
LODASH
IMMUTABILITY
SIDE EFFECTS
ES6
ARGUMENTS
BRACKETS + DOTS
CLOSURE
Part 1: Data Structures
Mastering objects & arrays by accessing, assigning, transforming, and organizing your data.
Part 2: Functions
Getting comfortable with creating and using functions in a more functional programming style.
Note: The first example of a concept tends to have intentional mistakes in them that are corrected in later slides. Be aware of this when copy/pasting slides.
Strengthen your understanding
of tricky JavaScript concepts by:
-
Understanding how to use functional utility methods
-
Understanding how to implement those methods
-
Applying JS fundamentals throughout the process
-
Hands-on practice
This course is about figuring out what happened to Mr. Boddy
... what?
Clue
Discover
WHO
killed Mr.Boddy
with what
WEAPON
and in which
ROOM
Sincere, not serious.
This is an interactive course.
There will be uncomfortable moments!
Expect to have to think critically, answer questions, ask questions.
OBJECTS
DATA STRUCTURES
const who = {
name: "Mrs. White"
};
const who = {
name: "Mrs. White"
};
const who = {};
who.name = "Mrs. White";
When are some other times you have seen other dots in JS?
const who = {
name: "Mrs. White"
};
const who = {};
who.name = "Mrs. White";
who
"name" :
"Mrs. White"
who
"name" :
"Mrs. White"
const who = {
name: "Mrs. White"
};
who.name; // → ?
const suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
suspect; // → ?
who.story; // → ?
who
"name" :
"Mrs. White"
suspect
"Mrs. White"
const who = {
name: "Mrs. White"
};
who.name; // → ?
const suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
who.story; // → ?
who
"name" :
"Mrs. White"
"Mr.Green"
suspect
"Mrs. White"
const who = {
name: "Mrs. White"
};
who.name; // → ?
const suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
suspect; // → ?
who.story; // → ?
who
"name" :
"Mrs. White"
"Mr.Green"
suspect
"Mrs. White"
const who = {
name: "Mrs. White"
};
who.name; // → ?
const suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
suspect; // → ?
who.story; // → ?
who
"name" :
"Mrs. White"
"Mr.Green"
suspect
"Mrs. White"
const who = {
name: "Mrs. White"
};
who.name; // → ?
const suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
suspect; // → ?
who.story; // → ?
who
"name" :
"Mrs. White"
"Mr.Green"
suspect
const who = {
name: "Mrs. White"
};
who.name; // → ?
let suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
suspect; // → ?
who.story; // → ?
"Mrs. White"
who
"name" :
"Mrs. White"
"Mr.Green"
suspect
const who = {
name: "Mrs. White"
};
who.name; // → ?
let suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
suspect; // → ?
who.story; // → ?
"Mrs. White"
"Mr.Green"
who
"name" :
"Mrs. White"
"Mr.Green"
suspect
const who = {
name: "Mrs. White"
};
who.name; // → ?
let suspect = who.name;
who.name = "Mr. Green";
suspect; // → ?
suspect = "Mr. Green";
suspect; // → ?
story; // → ?
"Mrs. White"
"Mr.Green"
OBJECTS
EXERCISE
_ = {};
_.get = function(object, path, defaultVal) {
if (object[path] === undefined) {
return defaultVal;
}
return object[path];
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → "Colonel Mustard"
_.get(who, 'story', 'We don\'t know yet');
// → "We don't know yet"
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
const _ = {};
_.get = function(object, path, defaultVal) {
if (object.path === undefined) {
return defaultVal;
}
return object.path;
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → ??
_.get(who, 'story', 'We don\'t know yet');
// → ??
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
undefined
default
"name"
path
{ who }
object
const _ = {};
_.get = function(object, path, defaultVal) {
if (object.path === undefined) {
return defaultVal;
}
return object.path;
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → ??
_.get(who, 'story', 'We don\'t know yet');
// → ??
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"path" :
undefined
default
"name"
path
{ who }
object
const _ = {};
_.get = function(object, path, defaultVal) {
if (object.path === undefined) {
return defaultVal;
}
return object.path;
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → undefined
_.get(who, 'story', 'We don\'t know yet');
// → ??
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"path" :
const _ = {};
_.get = function(object, path, defaultVal) {
if (object.path === undefined) {
return defaultVal;
}
return object.path;
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → undefined
_.get(who, 'story', 'We don\'t know yet');
// → ??
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"path" :
const _ = {};
_.get = function(object, path, defaultVal) {
if (object[path] === undefined) {
return defaultVal;
}
return object[path];
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → ??
_.get(who, 'story', 'We don\'t know yet');
// → ??
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"path" :
undefined
default
"name"
path
{ who }
object
const _ = {};
_.get = function(object, path, defaultVal) {
if (object[path] === undefined) {
return defaultVal;
}
return object[path];
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → "Colonel Mustard"
_.get(who, 'story', 'We don\'t know yet');
// → ??
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"path" :
undefined
default
"name"
path
{ who }
object
const _ = {};
_.get = function(object, path, defaultVal) {
if (object[path] === undefined) {
return defaultVal;
}
return object[path];
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → undefined
_.get(who, 'story', 'We don\'t know yet');
// → "We don't know yet"
"We don't know"
default
"story"
path
{ who }
object
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
const _ = {};
_.get = function(object, path, defaultVal) {
if (object[path] === undefined) {
return defaultVal;
}
return object[path];
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → "Colonel Mustard"
_.get(who, 'story', 'We don\'t know yet');
// → "We don't know yet"
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"We don't know"
default
path
{ who }
object
"story"
const _ = {};
_.get = function(object, path, defaultVal) {
if (object['path'] === undefined) {
return defaultVal;
}
return object['path'];
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → undefined
_.get(who, 'story', 'We don\'t know yet');
// → "We don't know yet"
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"path" :
const _ = {};
_.get = function(object, path, defaultValue) {
const result = object == null ? undefined : object[path];
return result === undefined ? defaultValue : result;
}
const who = { name : 'Colonel Mustard' };
_.get(who, 'name'); // → "Colonel Mustard"
_.get(who, 'story', 'We don\'t know yet');
// → "We don't know yet"
"name" :
"Col Mustard"
who
_
"get" :
Function () {}
"path" :
"We don't know"
default
"story"
path
{ who }
object
Arrays
DATA STRUCTURES
But Col Mustard is an
array of sunshine!
const who = {};
who.name = "Professor Plum";
let suspect = who.name;
who.name = "Mrs. Scarlett";
suspect; // → ?
suspect = "Mrs. Scarlett";
suspect; // → ?
who.story; // → ?
who
"name" :
"Prof. Plum"
"Mrs. Scarlett"
suspect
const who = {};
who.name = "Professor Plum";
let suspect = who.name;
who.name = "Mrs. Scarlett";
suspect; // → ?
suspect = "Mrs. Scarlett";
suspect; // → ?
who.story; // → ?
"Prof. Plum"
"Mrs. Scarlett"
const who = [];
who.name = "Professor Plum";
let suspect = who.name;
who.name = "Mrs. Scarlett";
suspect; // → ?
suspect = "Mrs. Scarlett";
suspect; // → ?
who.story; // → ?
const who = [];
who.name = "Professor Plum";
let suspect = who.name;
who.name = "Mrs. Scarlett";
suspect; // → ?
suspect = "Mrs. Scarlett";
suspect; // → ?
who.story; // → ?
When are some other times you have seen other dots in JS?
who
"name" :
suspect
"Prof. Plum"
"Mrs. Scarlett"
"Prof. Plum"
"Mrs. Scarlett"
const who = [];
who.name = "Mrs. Scarlett";
who[0]; // → ?
who[0] = "I was not in the Billiard Room.";
who[0]; // → ?
who[plea] = "I would never!";
who
"name" :
"Mrs. Scarlett"
who
const who = [];
who.name = "Mrs. Scarlett";
who[0]; // → ?
who[0] = "I was not in the Billiard Room.";
who[0]; // → ?
who[plea] = "I would never!";
"name" :
"Mrs. Scarlett"
who
"0" :
"I was not in..."
const who = [];
who.name = "Mrs. Scarlett";
who[0]; // → ?
who[0] = "I was not in the Billiard Room.";
who[0]; // → ?
who[plea] = "I would never!";
"name" :
"Mrs. Scarlett"
"0" :
"I was not in..."
who
const who = [];
who.name = "Mrs. Scarlett";
who[0]; // → ?
who[0] = "I was not in the Billiard Room.";
who[0]; // → ?
who[plea] = "I would never!";
const plea = "didShe";
"name" :
"Mrs. Scarlett"
"0" :
"I was not in..."
??
plea
who
const who = [];
who.name = "Mrs. Scarlett";
who[0]; // → ?
who[0] = "I was not in the Billiard Room.";
who[0]; // → ?
const plea = "didShe";
who[plea] = "I would never!";
"name" :
"Mrs. Scarlett"
"0" :
"I was not in..."
plea
"didShe"
"didShe" :
"I would never!"
who
const who = [];
who.name = "Mrs. Scarlett";
who[0]; // → ?
who[0] = "I was not in the Billiard Room.";
who[0]; // → ?
who["plea"] = "I would never!";
"name" :
"Mrs. Scarlett"
"0" :
"I was not in..."
"plea" :
"I would never!"
who
const who = [];
who.name = "Mrs. Scarlett";
who[0]; // → ?
who[0] = "I was not in the Billiard Room.";
who[0]; // → ?
who.plea = "I would never!";
"name" :
"Mrs. Scarlett"
"0" :
"I was not in..."
"plea" :
"I would never!"
who
const who = {};
const where = '^&*';
who['name'] = 'Mrs. Peacock';
who[0] = 'in the hall';
who['^&*'] = 'I\'m not sure what you are implying.';
who['^&*']; // → ?
who[2 - 2] = 'in the library';
who[3 + 2 - 5]; // → ?
who[where]; // → ?
"name" :
"Mrs. Peacock"
"0" :
"in the hall"
"^&*" :
"I'm not sure..."
who
"in the library"
where
"^&*"
THE RULES
Dots
Brackets
strings
numbers
quotations
weird characters
expressions
strings
numbers
variables
weird characters
expressions
Arrays
EXERCISE
Transformations
DATA STRUCTURES
const suspectNames = [
"Miss Scarlet",
"Col. Mustard",
"Mrs. White",
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
];
function createSuspect(name) {
return {
name: name,
color: name.split(" ")[2],
speak: function() {
console.log(`my name is ${name}`);
}
};
}
Can you find the bug?
const suspectNames = [
"Miss Scarlet",
"Col. Mustard",
"Mrs. White",
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
];
function createSuspect(name) {
return {
name: name,
color: name.split(" ")[1],
speak: function() {
console.log(`my name is ${name}`);
}
};
}
const suspectNames = [
"Miss Scarlet",
"Col. Mustard",
"Mrs. White",
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
];
function createSuspect(name) {
return {
name,
color: name.split(" ")[1],
speak: function() {
console.log(`my name is ${name}`);
}
};
}
const suspectNames = [
"Miss Scarlet",
"Col. Mustard",
"Mrs. White",
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
];
function createSuspect(name) {
const color = name.split(" ")[1];
return {
name,
color,
speak: function() {
console.log(`my name is ${name}`);
}
};
}
const suspectNames = [
"Miss Scarlet",
"Col. Mustard",
"Mrs. White",
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
];
function createSuspect(name) {
const color = name.split(" ")[1];
return {
name,
color,
speak() { console.log(`my name is ${name}`); }
};
}
const suspectNames = [
"Miss Scarlet",
"Col. Mustard",
"Mrs. White",
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListLoop = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
// ??
Let's add suspects to the suspectListLoop array
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListLoop = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (const i = 0; i < suspectNames.length; i++) {
// ??
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListLoop = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (let i = 0; i < suspectNames.length; i++) {
// ??
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListLoop = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (let i = 0; i < suspectNames.length; i++) {
const suspectName = suspectNames[i];
// ??
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListLoop = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (let i = 0; i < suspectNames.length; i++) {
const suspectName = suspectNames[i];
createSuspect(suspectName);
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListLoop = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (let i = 0; i < suspectNames.length; i++) {
const suspectName = suspectNames[i];
suspectListLoop.push(createSuspect(suspectName));
}
How can we improve?
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListForIn = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (const i in suspectNames) {
// ??
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListForIn = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (const i in suspectNames) {
const suspectName = suspectNames[i];
suspectListForIn.push(createSuspect(suspectName));
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListForIn = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (const i in suspectNames) {
const suspectName = suspectNames[i];
suspectListForIn.push(createSuspect(suspectName));
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListForIn = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
for (const i in suspectNames) {
const suspectName = suspectNames[i];
suspectListForIn.push(createSuspect(suspectName));
}
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListEach = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
suspectNames.forEach(
);
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListEach = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
suspectNames.forEach(suspectName => {
});
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListEach = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
suspectNames.forEach(suspectName => {
createSuspect(suspectName);
});
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListEach = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
suspectNames.forEach(suspectName => {
suspectListEach.push(createSuspect(suspectName));
});
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const suspectListMap = [];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
suspectNames.map(suspectName => {
});
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
const suspectListMap = suspectNames.map(suspectName => {
});
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
const suspectListMap = suspectNames.map(suspectName => {
createSuspect(suspectName);
});
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
function createSuspect(name) {
const color = name.split(" ")[1];
const speak = () => { console.log(`my name is ${name}`); };
return { name, color, speak };
}
const suspectListMap = suspectNames.map(suspectName => {
return createSuspect(suspectName);
});
const suspectNames = ["Miss Scarlet", "Col. Mustard", "Mrs. White"];
suspectNames.metaData = { provenInnocent: [] };
const speak = () => { console.log(`my name is ${name}`); };
function createSuspect(name) {
const color = name.split(" ")[1];
return { name, color, speak };
}
const suspectListMap = suspectNames.map(suspectName => {
return createSuspect(suspectName);
});
Transformations
EXERCISE
Organization
DATA STRUCTURES
[
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0],
"Mrs. White": [0, 0, 0, 0],
"Miss Scarlet": [0, 0, 0, 0],
"Col. Mustard": [0, 0, 0, 0]
},
{
"Revolver": [0, 0, 0, 0],
"Knife": [0, 0, 0, 0],
"Lead Pipe": [0, 0, 0, 0],
"Candlestick": [0, 0, 0, 0],
"Rope": [0, 0, 0, 0],
"Wrench": [0, 0, 0, 0]
},
{
"Billiard Room": [0, 0, 0, 0],
"Kitchen": [0, 0, 0, 0],
"Library": [0, 0, 0, 0],
"Conservatory": [0, 0, 0, 0],
"Hall": [0, 0, 0, 0],
"Dining Room": [0, 0, 0, 0]
}
];
const suspectNames = [
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum",
"Mrs. White",
"Miss Scarlet",
"Col. Mustard"
];
const weapons = [
"Revolver",
"Knife",
"Lead Pipe",
"Candlestick",
"Rope",
"Wrench"
];
const rooms = [
"Billiard Room",
"Kitchen",
"Library",
"Conservatory",
"Hall",
"Dining Room"
];
Input
const suspectNames = [
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum",
"Mrs. White",
"Miss Scarlet",
"Col. Mustard"
];
const weapons = [
"Revolver",
"Knife",
"Lead Pipe",
"Candlestick",
"Rope",
"Wrench"
];
const rooms = [
"Billiard Room",
"Kitchen",
"Library",
"Conservatory",
"Hall",
"Dining Room"
];
[
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0],
"Mrs. White": [0, 0, 0, 0],
"Miss Scarlet": [0, 0, 0, 0],
"Col. Mustard": [0, 0, 0, 0]
},
{
"Revolver": [0, 0, 0, 0],
"Knife": [0, 0, 0, 0],
"Lead Pipe": [0, 0, 0, 0],
"Candlestick": [0, 0, 0, 0],
"Rope": [0, 0, 0, 0],
"Wrench": [0, 0, 0, 0]
},
{
"Billiard Room": [0, 0, 0, 0],
"Kitchen": [0, 0, 0, 0],
"Library": [0, 0, 0, 0],
"Conservatory": [0, 0, 0, 0],
"Hall": [0, 0, 0, 0],
"Dining Room": [0, 0, 0, 0]
}
];
Input
Output
const suspectNames = [
"Mr. Green"
];
{
"Mr. Green": [0, 0, 0, 0]
}
Input
Desired Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const suspectNames = [
"Mr. Green"
];
??
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const emptyTracker = createEmptyArray(4,0);
const suspectNames = [
"Mr. Green"
];
[0, 0, 0, 0] // emptyTracker
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const emptyTracker = createEmptyArray(4,0);
const tracker = {};
const suspectNames = [
"Mr. Green"
];
[0, 0, 0, 0] // emptyTracker
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const emptyTracker = createEmptyArray(4,0);
const tracker = {};
const suspectNames = [
"Mr. Green"
];
const suspect = suspectNames[0];
{
"Mr. Green": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const emptyTracker = createEmptyArray(4,0);
const tracker = {};
const suspectNames = [
"Mr. Green"
];
const suspect = suspectNames[0];
tracker[suspect] = emptyTracker;
{
"Mr. Green": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = [
"Mr. Green"
];
const suspect = suspectNames[0];
tracker[suspect] = createEmptyArray(4,0);
{
"Mr. Green": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = [
"Mr. Green"
];
const suspect = suspectNames[0];
tracker[suspect] = createEmptyArray(4,0);
{
"Mr. Green": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
suspectNames.forEach(name => {
??
});
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
suspectNames.forEach(name => {
tracker[name] = ??
});
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
suspectNames.forEach(name => {
tracker[name] = createEmptyArray(4,0);
});
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
[
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0]
},
{
"Revolver": [0, 0, 0, 0],
"Knife": [0, 0, 0, 0]
},
{
"Billiard Room": [0, 0, 0, 0],
"Kitchen": [0, 0, 0, 0]
}
];
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = [suspectNames, weapons, rooms];
[
[
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
],
[
"Revolver",
"Knife"
],
[
"Billiard Room",
"Kitchen"
]
]
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {
suspectNames,
weapons,
rooms
};
{
"suspectNames": [
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
],
"weapons": [
"Revolver",
"Knife"
],
"rooms": [
"Billiard Room",
"Kitchen"
]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {
suspectNames: suspectNames,
weapons: weapons,
rooms: rooms
};
{
"suspectNames": [
"Mr. Green",
"Mrs. Peacock",
"Prof. Plum"
],
"weapons": [
"Revolver",
"Knife"
],
"rooms": [
"Billiard Room",
"Kitchen"
]
}
Input
Output
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = [ "Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0],
"Mrs. White": [0,0,0,0],
"Miss Scarlet": [0,0,0,0],
"Col. Mustard": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0],
"Lead Pipe": [0,0,0,0],
"Candlestick": [0,0,0,0],
"Rope": [0,0,0,0],
"Wrench": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0],
"Library": [0,0,0,0],
"Conservatory": [0,0,0,0],
"Hall": [0,0,0,0],
"Dining Room": [0,0,0,0]
}
}
Input
Better Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0],
"Mrs. White": [0,0,0,0],
"Miss Scarlet": [0,0,0,0],
"Col. Mustard": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0],
"Lead Pipe": [0,0,0,0],
"Candlestick": [0,0,0,0],
"Rope": [0,0,0,0],
"Wrench": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0],
"Library": [0,0,0,0],
"Conservatory": [0,0,0,0],
"Hall": [0,0,0,0],
"Dining Room": [0,0,0,0]
}
}
Previous Result
Better Result
[
{
"Mr. Green": [0, 0, 0, 0],
"Mrs. Peacock": [0, 0, 0, 0],
"Prof. Plum": [0, 0, 0, 0],
"Mrs. White": [0, 0, 0, 0],
"Miss Scarlet": [0, 0, 0, 0],
"Col. Mustard": [0, 0, 0, 0]
},
{
"Revolver": [0, 0, 0, 0],
"Knife": [0, 0, 0, 0],
"Lead Pipe": [0, 0, 0, 0],
"Candlestick": [0, 0, 0, 0],
"Rope": [0, 0, 0, 0],
"Wrench": [0, 0, 0, 0]
},
{
"Billiard Room": [0, 0, 0, 0],
"Kitchen": [0, 0, 0, 0],
"Library": [0, 0, 0, 0],
"Conservatory": [0, 0, 0, 0],
"Hall": [0, 0, 0, 0],
"Dining Room": [0, 0, 0, 0]
}
];
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
for (const section in gameData) {
tracker[section] = ??
}
??
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
for (const section in gameData) {
tracker[section] = {};
}
??
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
for (const section in gameData) {
tracker[section] = {};
}
{
"suspectNames": {},
"weapons": {},
"rooms": {}
}
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData);
[
"suspectNames",
"weapons",
"rooms"
]
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
});
{
"suspectNames": {},
"weapons": {},
"rooms": {}
}
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
section.forEach(item => {
console.log(item);
});
});
?
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
section.forEach(item => {
console.log(item);
});
});
?
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(section);
// section.forEach(item => {
// console.log(item);
// });
});
?
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(section);
// section.forEach(item => {
// console.log(item);
// });
});
"suspectNames"
"weapons"
"rooms"
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(gameData[section]);
// section.forEach(item => {
// console.log(item);
// });
});
["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
["Revolver", "Knife"]
["Billiard Room", "Kitchen"]
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
// section.forEach(item => {
// console.log(item);
// });
});
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = [ "Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
console.log(item);
});
});
??
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = [ "Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
console.log(item);
});
});
suspectNames : Mr. Green,Mrs. Peacock,Prof. Plum
"Mr. Green"
"Mrs. Peacock"
"Prof. Plum"
weapons : Revolver,Knife
"Revolver"
"Knife"
rooms : Billiard Room,Kitchen
"Billiard Room"
"Kitchen"
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
tracker[section] = "some string";
});
});
console.log(tracker);
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
??
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
tracker[section] = "some string";
});
});
console.log(tracker);
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
{
"suspectNames": "some string",
"weapons": "some string",
"rooms": "some string"
}
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
tracker[item] = "some string";
});
});
console.log(tracker);
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
??
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
tracker[item] = "some string";
});
});
console.log(tracker);
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
{
"suspectNames": {},
"Mr. Green": "some string",
"Mrs. Peacock": "some string",
"Prof. Plum": "some string",
"weapons": {},
"Revolver": "some string",
"Knife": "some string",
"rooms": {},
"Billiard Room": "some string",
"Kitchen": "some string"
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
tracker[item] = createEmptyArray(4,0);
});
});
console.log(tracker);
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
{ // ??
"suspectNames": {},
"Mr. Green": "some string",
"Mrs. Peacock": "some string",
"Prof. Plum": "some string",
"weapons": {},
"Revolver": "some string",
"Knife": "some string",
"rooms": {},
"Billiard Room": "some string",
"Kitchen": "some string"
}
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
tracker[item] = createEmptyArray(4,0);
});
});
console.log(tracker);
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
{
"suspectNames": {},
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0],
"weapons": {},
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0],
"rooms": {},
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
console.log(`${section} : ${gameData[section]}`);
gameData[section].forEach(item => {
tracker[section][item] =
createEmptyArray(4,0);
});
});
console.log(tracker);
suspectNames: ["Mr. Green", "Mrs. Peacock", "Prof. Plum"]
weapons: ["Revolver", "Knife"]
rooms: ["Billiard Room", "Kitchen"]
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
}
Input
Output
// Desired Result
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
function createEmptyArray(length, value) {
return Array(length).fill(value);
}
const tracker = {};
const suspectNames = ["Mr. Green", "Mrs. Peacock", "Prof. Plum"];
const weapons = ["Revolver", "Knife",];
const rooms = ["Billiard Room", "Kitchen"];
const gameData = {suspectNames, weapons, rooms};
Object.keys(gameData).forEach(section => {
tracker[section] = {};
gameData[section].forEach(item => {
tracker[section][item] =
createEmptyArray(4,0);
});
});
console.log(tracker);
{
"suspectNames": {
"Mr. Green": [0,0,0,0],
"Mrs. Peacock": [0,0,0,0],
"Prof. Plum": [0,0,0,0]
},
"weapons": {
"Revolver": [0,0,0,0],
"Knife": [0,0,0,0]
},
"rooms": {
"Billiard Room": [0,0,0,0],
"Kitchen": [0,0,0,0]
}
}
Input
Output
Organization
EXERCISE
Part 1 DONE
Further Reading
- ES6 getters + setters
- Maps, Sets, WeakMaps, WeakSets
- JSON
- Symbol
Warm Up Exercise
Functions:
Intro & Review
Functions - The Basics
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = () => {
};
_.partition(); // → [[1, 3], [2, 4]]
const _ = {};
_.partition = () => {
};
Function Definition
const _ = {};
_.partition = () => {
};
Function Body
const _ = {};
_.partition = function() {
};
Function Body
const _ = {};
_.partition = function() {
};
_.partition();
function invocation
const _ = {};
_.partition = function(list, predicate) {
};
_.partition();
parameters
const _ = {};
_.partition = function(list, predicate) {
};
_.partition([1,2,3]);
parameters
arguments
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
console.log(_); // ??
};
console.log(result); // ??
_.partition([1,2,3]);
local scope
global scope
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
console.log(_); // { ... }
};
console.log(result); // ??
_.partition([1,2,3]);
local scope
global scope
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
console.log(_); // { ... }
};
console.log(result); // ??
_.partition([1,2,3]);
local scope
global scope
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3]);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
};
const isOdd = function(n) {
return n % 2;
}
isOdd(2); // ??
isOdd(3); // ??
_.partition([1,2,3]);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
};
const isOdd = function(n) {
return n % 2;
}
isOdd(2); // 0
isOdd(3); // 1
_.partition([1,2,3]);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
isOdd();
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
console.log(predicate); // ??
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
console.log(predicate);
// => ƒ (n) {
// return n % 2;
// }
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
console.log(predicate === isOdd); // ??
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
console.log(predicate === isOdd); // true
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
result.forEach((item, index, list) => {
console.log(item); // ??
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
const item = "Oh, hello there.";
result.forEach((item, index, list) => {
console.log(item); // ??
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
result.forEach((item, index, list) => {
console.log(item); // [], []
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
list.forEach((item, index, list) => {
console.count('I\'ve been called...'); // ??
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
list.forEach((item, index, list) => {
console.count('I\'ve been called...'); // ??
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
list.forEach((item, index, list) => {
console.log(item); // ??
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
list.forEach((item, index, list) => {
console.log(item); // ??
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
list.forEach((item, index, list) => {
console.log(list); // ??
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = function(list, predicate) {
const result = [[],[]];
const item = "Oh, hello there.";
list.forEach((item, index, list) => {
console.log(list); // ??
});
};
const isOdd = function(n) {
return n % 2;
}
_.partition([1,2,3,4], isOdd);
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
console.log(arguments); // ??
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
console.log(arguments);
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((...args) => {
console.log(args); // ??
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((...args) => {
console.log(args);
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((...args) => {
console.log(...args); // ??
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((...args) => {
console.log(...args);
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach(...args => {
console.log(...args); // ??
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach(...args => {
console.log(...args);
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
console.log(predicate); // ??
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
predicate vs iteratee
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
console.log(predicate);
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
console.log(predicate());
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
console.log(predicate());
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
predicate(item); // ?
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
if(predicate(item)) {
// ??
} else {
// ??
}
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
if(predicate(item)) {
// add to left
} else {
// add to right
}
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
if(predicate(item)) {
result[0].push(item);
} else {
result[1].push(item);
}
});
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
if(predicate(item)) {
result[0].push(item);
} else {
result[1].push(item);
}
});
return result;
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
Intro & Review
EXERCISE
Callbacks + Higher Order Functions
FUNCTIONS
1. HOFs take a function as an input.
element.addEventListener("change", () => {
console.log("Our evidence is updated");
});
2. HOFs return a function as the output
const newClue = (name) => {
const length = name.length;
return (weapon) => {
const clue = length + weapon.length;
return !!(clue % 1);
};
};
const ifElse = (condition, isTrue, isFalse) => {
return condition ? isTrue() : isFalse();
};
ifElse(isGuilty,
() => { console.log('GUILTY!!');},
() => { console.log('NOT GUILTY');}
);
const ifElse = (condition, isTrue, isFalse) => {
return condition ? isTrue() : isFalse();
};
const logTrue = () => { console.log('GUILTY!!');}
const logFalse = () => { console.log('NOT GUILTY');}
ifElse(true, logTrue, logFalse);
const ifElse = (condition, isTrue, isFalse, p) => {
//How do we pass arguments?
return condition ? isTrue(p) : isFalse(p);
};
ifElse(true, fn1, fn2, 'HI');
const ifElse = (condition, isTrue, isFalse, ...args) => {
console.log(args); //['HI', 'BYE', 'HOLA']
return condition ?
isTrue(...args) : // isTrue('HI', 'BYE', 'HOLA')
isFalse(...args);
};
ifElse(true, fn1, fn2, 'HI', 'BYE', 'HOLA');
const ifElse = (condition, isTrue, isFalse) => {
const args = [].slice.call(arguments, 3);
return condition ?
isTrue.apply(this, args) :
isFalse.apply(this, args);
};
const logTrue = (msgs) => { console.log(msgs); };
const logFalse = (msgs) => { console.log(msgs); };
ifElse(true, logTrue, logFalse, 'a', 'b');
const ifElse = (condition, isTrue, isFalse) => {
const args = [].slice.call(arguments, 3);
return condition ?
isTrue.apply(this, args) :
isFalse.apply(this, args);
};
const logTrue = (msgs) => { console.log(msgs); };
const logFalse = (msgs) => { console.log(msgs); };
ifElse(true, logTrue, logFalse, 'a', 'b');
const ifElse = function(condition, isTrue, isFalse) {
const args = [].slice.call(arguments, 3);
return condition ?
isTrue.apply(this, args) :
isFalse.apply(this, args);
};
const logTrue = (msgs) => { console.log(msgs); };
const logFalse = (msgs) => { console.log(msgs); };
ifElse(true, logTrue, logFalse, 'a', 'b');
Callbacks + HOF
EXERCISE
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
predicate(item) ?
result[0].push(item) :
result[1].push(item);
});
return result;
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item, index, list) => {
result[predicate(item) ? 0 : 1].push(item)
});
return result;
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach((item) => {
result[predicate(item) ? 0 : 1].push(item)
});
return result;
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach(item => {
result[predicate(item) ? 0 : 1].push(item)
});
return result;
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach(item => result[predicate(item) ? 0 : 1].push(item));
return result;
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition => (collection, predicate) {
const basePartition = (result, value) => (
result[predicate(value) ? 0 : 1].push(value), result
);
return _.transform(collection, basePartition , [[], []]);
}
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
const _ = {};
_.partition => (collection, predicate) {
const basePartition = (result, value) => (
result[predicate(value) ? 0 : 1].push(value), result
);
return _.reduce(collection, basePartition , [[], []]);
}
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
FUNCTIONAL
STYLE
FUNCTIONS
IMMUTABLE
CURRIED
ITERATEE
DATA
ITERATEE
DATA
ITERATEE FIRST - DATA LAST
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach(item => result[predicate(item) ? 0 : 1].push(item));
return result;
};
_.partition([1, 2, 3, 4], n => n % 2);
// → [[1, 3], [2, 4]]
ITERATEE FIRST - DATA LAST
const _ = {};
_.partition = (list, predicate) => {
const result = [[],[]];
list.forEach(item => result[predicate(item) ? 0 : 1].push(item));
return result;
};
_.partition( n => n % 2, [1, 2, 3, 4]);
// → [[1, 3], [2, 4]]
ITERATEE FIRST - DATA LAST
const _ = {};
_.partition = (predicate, list) => {
const result = [[],[]];
list.forEach(item => result[predicate(item) ? 0 : 1].push(item));
return result;
};
_.partition( n => n % 2, [1, 2, 3, 4]);
// → [[1, 3], [2, 4]]
IMMUTABLE
IMMUTABLE
_.defaults = (object, ...sources) => {
sources.forEach(source => {
for (const key in source) {
const value = object[key];
if (value === undefined) {
object[key] = source[key];
}
}
});
return object;
};
IMMUTABLE
_.defaults = (object, ...sources) => {
const clonedObject = { ...object };
sources.forEach(source => {
for (const key in source) {
const value = clonedObject[key];
if (value === undefined) {
object[key] = source[key];
}
}
});
return clonedObject;
};
CURRIED
FUNCTIONAL
STYLE
EXERCISE
Currying
FUNCTIONS
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
curriedGuess("Mrs. Peacock")("library")("candlestick");
// => "I think it was Mrs. Peacock in the library with a candlestick"
console.log(typeof curriedGuess); //?
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
curriedGuess("Mrs. Peacock")("library")("candlestick");
// => "I think it was Mrs. Peacock in the library with a candlestick"
console.log(typeof curriedGuess); // function
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
const guessLater = curriedGuess("Miss Scarlett", "billiards room");
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
const guessLater = curriedGuess("Miss Scarlett", "billiards room");
console.log(typeof guessLater); // => ??
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
const guessLater = curriedGuess("Miss Scarlett", "billiards room");
console.log(typeof guessLater); // => function
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
const guessLater = curriedGuess("Miss Scarlett", "billiards room");
guessLater("candlestick");
// => ??
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
const guessLater = curriedGuess("Miss Scarlett", "billiards room");
guessLater("candlestick");
// => "I think it was Miss Scarlett in the billiards room with a candlestick"
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
const guessLater = curriedGuess(_, _,"candlestick")
guessLater("Colonel Mustard", "kitchen");
// => "I think it was Colonel Mustard in the kitchen with a candlestick"
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
curriedGuess("Mrs. Peacock")("library")("candlestick");
curriedGuess("Miss Scarlett", "billiards room")("candlestick");
const guessLater = curriedGuess(_, _,"candlestick")
guessLater("Colonel Mustard", "kitchen");
// => "I think it was Mrs. Peacock in the library with a candlestick"
// => "I think it was Miss Scarlett in the billiards room with a candlestick"
// => "I think it was Colonel Mustard in the kitchen with a candlestick"
- arity
- func.length
IMMUTABLE
CURRIED
ITERATEE
DATA
const clue = () => {
const msg = "Help! I think I found a clue!";
const logger = () => {
console.log(msg);
};
setTimeout(logger, 1000);
console.log("what happens first? this log or the halp above?");
};
clue();
// => ??
// => ??
const clue = () => {
const msg = "Help! I think I found a clue!";
const logger = () => {
console.log(msg);
};
setTimeout(logger, 1000);
console.log("What happens first? this log or the halp above?");
};
clue();
// => "What happens first? this log or the halp above?"
// => "Help! I think I found a clue!"
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
console.log(typeof funcClueCounter1); // => ??
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
console.log(typeof funcClueCounter1); // => function
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const funcClueCounter2 = clueCounter('Another clue #');
console.log(typeof funcClueCounter1); // => function
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const funcClueCounter2 = clueCounter('Another clue #');
console.log(typeof funcClueCounter1); // => function
console.log(funcClueCounter1 === funcClueCounter2); // => ??
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const funcClueCounter2 = clueCounter('Another clue #');
console.log(typeof funcClueCounter1); // => function
console.log(funcClueCounter1 === funcClueCounter2); // => false
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const funcClueCounter2 = clueCounter('Another clue #');
funcClueCounter1(), funcClueCounter1(), funcClueCounter1();
// => ??
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const funcClueCounter2 = clueCounter('Another clue #');
funcClueCounter1(), funcClueCounter1(), funcClueCounter1();
// => "Clue # 1"
// => "Clue # 2"
// => "Clue # 3"
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const funcClueCounter2 = clueCounter('Another clue #');
funcClueCounter1(), funcClueCounter1(), funcClueCounter1();
// => "Clue # 1"
// => "Clue # 2"
// => "Clue # 3"
funcClueCounter2();
// => ??
const clueCounter = (msg) => {
let count = 0;
const logger = () => {
console.log(`${msg} ${++count}`);
};
return logger;
};
const funcClueCounter1 = clueCounter('Clue #');
const funcClueCounter2 = clueCounter('Another clue #');
funcClueCounter1(), funcClueCounter1(), funcClueCounter1();
// => "Clue # 1"
// => "Clue # 2"
// => "Clue # 3"
funcClueCounter2();
// => "Another clue # 1"
const cC = (msg) => {
let count = 0;
const lg = () => {
console.log(`${msg} ${++count}`);
};
return lg;
};
const cc1 = cC('Clue #');
const cc2 = cC('Another clue #');
cc1(), cc1(), cc1();
cc2();
fn { ... }
cC
lg() { ... }
cc1
"Clue #"
msg
lg() { ... }
lg
0
count
lg() { ... }
cc2
"Anot.."
msg
lg() { ... }
lg
0
count
const cC = (msg) => {
let count = 0;
const lg = () => {
console.log(`${msg} ${++count}`);
};
return lg;
};
const cc1 = cC('Clue #');
const cc2 = cC('Another clue #');
cc1(), cc1(), cc1();
cc2();
lg() { ... }
cc1
"Clue #"
msg
lg() { ... }
lg
0
count
1
2
3
lg() { ... }
cc2
"Anot.."
msg
lg() { ... }
lg
0
count
1
const countClues = () => {
let n = 0;
return {
count: () => n++,
reset: () => n = 0
};
};
const countClues = () => {
let n = 0;
return {
count: () => n++,
reset: () => n = 0
};
};
fn { ... }
countClues
const countClues = () => {
let n = 0;
return {
count: () => n++,
reset: () => n = 0
};
};
const c = countClues();
fn { ... }
countClues
0
n
{ count: fn,
reset: fn }
c
const countClues = () => {
let n = 0;
return {
count: () => n++,
reset: () => n = 0
};
};
const c = countClues();
console.log(c);
{
count: () => n++,
reset: () => n = 0
}
fn { ... }
countClues
0
n
{ count: fn,
reset: fn }
c
const countClues = () => {
let n = 0;
return {
count: () => n++,
reset: () => n = 0
};
};
const c = countClues();
const d = countClues();
fn { ... }
countClues
0
n
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
const countClues = () => {
let n = 0;
return {
count: () => n++,
reset: () => n = 0
};
};
const c = countClues();
const d = countClues();
c.count();
-> ??
fn { ... }
countClues
0
n
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
const countClues = () => {
let n = 0;
return {
count: () => n++,
reset: () => n = 0
};
};
const c = countClues();
const d = countClues();
c.count();
-> 0
fn { ... }
countClues
1
n
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
const countClues = () => {
let n = 0;
return {
count: () => ++n,
reset: () => n = 0
};
};
const c = countClues();
const d = countClues();
c.count();
-> 1
fn { ... }
countClues
1
n
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
const countClues = () => {
let n = 0;
return {
count: () => ++n,
reset: () => n = 0
};
};
const c = countClues();
const d = countClues();
c.count(), c.count();
d.count();
fn { ... }
countClues
2
n
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
-> ??
1
1
const countClues = () => {
let n = 0;
return {
count: () => ++n,
reset: () => n = 0
};
};
const c = countClues();
const d = countClues();
c.count(), c.count();
d.count();
fn { ... }
countClues
2
n
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
-> 1
1
1
Currying
EXERCISE
const guess = function(suspect, room, weapon) {
console.log(`I think it was ${suspect} in the ${room} with a ${weapon}`);
};
const curriedGuess = _.curry(guess);
curriedGuess("Mrs. Peacock")("library")("candlestick");
CONCLUSION
Further Reading
async + await
generator functions (yield)
backticks (``)
ASSETS
fn { ... }
1
clueCn
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
fn { ... }
1
n
{ count: fn,
reset: fn }
c
d
0
n
{ count: fn,
reset: fn }
[ [], [] ]
result
{ ... }
_
n => n % 2
predicate
[1, 2, 3, 4]
list
??
index
??
item
[1, 2, 3, 4]
list
0
n
fn { ... }
countClues
0
n
??
index
{ count: fn,
reset: fn }
firstCounter
fn { ... }
countClues
0
n
{ count: fn,
reset: fn }
c
"name" :
"Mrs. Scarlett"
who
??
plea
"plea" :
"I would never!"
"name" :
"Mrs. Scarlett"
who
"0" :
"I was not in..."
"name" :
"Mrs. Scarlett"
who
"0" :
"I was not in..."
"plea" :
"I would never!"
DEBUG
const mrsScarlet = { ... };
const mrsScarlet = { ... };
const profPlum = { ... };
const mrsScarlet = { ... };
const profPlum = { ... };
const colMustard = { ... };