freeCodeCamp/challenges/object-oriented-and-functional-programming.json

386 lines
16 KiB
JSON
Raw Normal View History

{
2015-08-13 00:21:52 +01:00
"name": "Object Oriented and Functional Programming",
"order": 6,
"note": [
2015-08-16 05:25:10 -07:00
"Methods",
2015-08-16 04:05:15 -07:00
"Closures",
"Factories",
"Pure Functions",
"Currying Functions",
"Functors",
"Currying Functions"
],
"challenges": [
{
"id":"cf1111c1c15feddfaeb1bdef",
2015-08-16 08:03:34 -07:00
"title": "Declare JavaScript Objects as Variables",
"difficulty":0,
"description":[
2015-08-15 13:57:44 -07:00
"Before we dive into Object Oriented Programming, let's revisit JavaScript objects.",
2015-08-18 02:05:53 -04:00
"Give your <code>motorBike</code> object a <code>wheels</code>, <code>engines</code> and <code>seats</code> attribute and set them to numbers."
],
"tests":[
"assert(typeof(motorBike.engines) === 'number', 'message: <code>motorBike</code> should have a <code>engines</code> attribute set to a number.');",
"assert(typeof(motorBike.wheels) === 'number', 'message: <code>motorBike</code> should have a <code>wheels</code> attribute set to a number.');",
"assert(typeof(motorBike.seats) === 'number', 'message: <code>motorBike</code> should have a <code>seats</code> attribute set to a number.');"
],
"challengeSeed":[
"//Here is a sample Object",
"var car = {",
2015-08-16 04:05:15 -07:00
" \"wheels\":4,",
" \"engines\":1,",
" \"seats\":5",
"};",
"",
"//Now Let's make a similar Object called motorBike",
"//Give it two wheels, one engine and one seat",
"var motorBike = {",
2015-08-16 04:05:15 -07:00
" // Only change code below this line.",
"",
"",
"",
" // Only change code above this line.",
"};",
"",
2015-08-27 22:18:09 +02:00
"(function() {return JSON.stringify(motorBike);})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint",
"type": "waypoint"
},
{
"id":"cf1111c1c15feddfaeb2bdef",
2015-08-16 08:03:34 -07:00
"title": "Construct JavaScript Objects with Functions",
"difficulty":0,
"description":[
2015-08-16 04:05:15 -07:00
"We are also able to create objects using <code>constructor</code> functions.",
"Give your <code>myMotorBike</code> object a <code>wheels</code>, <code>engines</code> and <code>seats</code> attribute and set them to numbers."
],
"tests":[
"assert(typeof((new MotorBike()).engines) === 'number', 'message: <code>myMotorBike</code> should have a <code>engines</code> attribute set to a number.');",
"assert(typeof((new MotorBike()).wheels) === 'number', 'message: <code>myMotorBike</code> should have a <code>wheels</code> attribute set to a number.');",
"assert(typeof((new MotorBike()).seats) === 'number', 'message: <code>myMotorBike</code> should have a <code>seats</code> attribute set to a number.');"
],
"challengeSeed":[
2015-08-18 02:05:53 -04:00
"// Let's add the properties engines and seats to the car in the same way that the property wheels has been added below. They should both be numbers.",
2015-08-16 05:25:10 -07:00
"var Car = function() {",
2015-08-16 04:05:15 -07:00
" this.wheels = 4;",
" this.engines = 1;",
" this.seats = 1;",
"};",
"",
2015-08-16 05:25:10 -07:00
"var myCar = new Car();",
"",
"// Only change code below this line.",
"var MotorBike = function() {",
"",
"",
"",
"};",
"",
"var myMotorBike = new MotorBike();",
2015-08-16 04:05:15 -07:00
"// Only change code above this line.",
"",
2015-08-27 22:18:09 +02:00
"(function() {return JSON.stringify(myMotorBike);})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id":"cf1111c1c15feddfaeb3bdef",
2015-08-16 08:03:34 -07:00
"title":"Make Object Properties Private",
"difficulty":0,
"description":[
2015-08-16 05:25:10 -07:00
"Objects have their own attributes, called <code>properties</code>, and their own functions, called <code>methods</code>.",
"In the previous challenge, we used the <code>this</code> keyword to reference <code>public properties</code> and <code>public methods</code> of the current object.",
"We can also create <code>private properties</code> and <code>private methods</code>, which aren't accessible from outside the object.",
"To do this, we omit the word <code>this</code> from the <code>property</code> or <code>method</code> declaration.",
"See if you can keep <code>myBike.speed</code> and <code>myBike.addUnit</code> private, while making <code>myBike.getSpeed</code> publicly accessible."
],
"tests":[
"assert(typeof(myBike.getSpeed)!=='undefined' && typeof(myBike.getSpeed) === 'function', 'message: The method getSpeed of myBike should be accessible outside the object.');",
"assert(typeof(myBike.speed) === 'undefined', 'message: <code>myBike.speed</code> should remain undefined.');",
"assert(typeof(myBike.addUnit) === 'undefined', 'message: <code>myBike.addUnit</code> should remain undefined.');"
],
"challengeSeed":[
2015-10-04 23:20:09 -04:00
"//Let's create an object with two functions. One attached as a property and one not.",
2015-08-16 05:25:10 -07:00
"var Car = function() {",
" this.gear = 1;",
" function addStyle(styleMe){",
2015-08-27 22:18:09 +02:00
" return 'The Current Gear Is: ' + styleMe;",
2015-08-16 05:25:10 -07:00
" }",
" this.getGear = function() {",
2015-08-27 22:18:09 +02:00
" return addStyle(this.gear);",
2015-08-16 05:25:10 -07:00
" };",
"};",
"",
2015-08-16 05:25:10 -07:00
"var Bike = function() {",
2015-08-16 19:34:11 -07:00
" // Only change code below this line.",
2015-08-16 05:25:10 -07:00
" this.speed = 100;",
" function addUnit(value) {",
2015-08-27 22:18:09 +02:00
" return value + \"KM/H\";",
2015-08-16 05:25:10 -07:00
" }",
" ",
" getSpeed = function () {",
2015-08-27 22:18:09 +02:00
" return addUnit(speed);",
2015-08-16 05:25:10 -07:00
" };",
" ",
"};",
"",
2015-08-16 19:34:11 -07:00
"// Only change code above this line.",
"var myCar = new Car();",
"var myBike = new Bike();",
"",
2015-08-27 22:18:09 +02:00
"if(myBike.hasOwnProperty('getSpeed')){(function() {return JSON.stringify(myBike.getSpeed());})();};"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id":"cf1111c1c15feddfaeb4bdef",
2015-08-16 19:34:11 -07:00
"title":"Make Instances of Objects with a Constructor Function",
"difficulty":0,
"description":[
2015-08-16 05:25:10 -07:00
"Sometimes you'll want to be able to easily create similar objects.",
"Objects have their own attributes, called <code>properties</code>, and their own functions, called <code>methods</code>.",
"A function that creates objects is called a <code>constructor</code>.",
"You can create <code>instances</code> of an object using a <code>constructor</code>.",
"Each new <code>instance</code> of this object <code>inherits</code> all the <code>properties</code> and <code>methods</code> of your original object.",
"Then you can give the instance new properties."
],
"tests":[
"assert((new Car()).wheels === 4, 'message: The property <code>wheels</code> should still be 4 like in the object constructor.');",
"assert(typeof((new Car()).engines) === 'undefined', 'message: There should not be a property <code>engines</code> in the object constructor.');",
"assert(myCar.wheels === 4, 'message: The property <code>wheels</code> of myCar should equal 4.');",
"assert(typeof(myCar.engines) === 'number', 'message: The property <code>engines</code> of myCar should be a number.');"
],
"challengeSeed":[
2015-08-16 05:25:10 -07:00
"var Car = function() {",
" this.wheels = 4;",
"};",
"",
2015-08-16 19:34:11 -07:00
"// Only change code below this line.",
"var myCar = new Car();",
"",
2015-08-16 05:25:10 -07:00
"//Add the property \"engines\" to myCar, and make it a number.",
"",
"",
2015-08-16 19:34:11 -07:00
"// Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return JSON.stringify(myCar);})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id":"cf1111c1c15feddfaeb7bdef",
2015-08-16 19:34:11 -07:00
"title":"Iterate over Arrays with .map",
"difficulty":0,
"description":[
2015-08-16 04:05:15 -07:00
"<code>array = array.map(function(val){</code>",
2015-08-27 22:18:09 +02:00
"<code>&thinsp;&thinsp;return val+1;</code>",
2015-08-16 04:05:15 -07:00
"<code>});</code>",
"",
"The map method is one of the easiest ways to iterate through an array or object there is. Let's use it now.",
2015-08-23 05:03:52 -04:00
"Use the map function to add 3 to every value in the variable <code>array</code>"
],
"tests":[
"assert.deepEqual(array, [4,5,6,7,8], 'message: You should add three to each value in the array.');",
"assert(editor.getValue().match(/\\.map\\s*\\(/gi), 'message: You should be making use of the map method.');",
"assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\]/gi), 'message: You should only modify the array with <code>.map</code>.');"
],
"challengeSeed":[
"//Use map to add three to each value in the array",
"var array = [1,2,3,4,5];",
2015-08-16 19:34:11 -07:00
"// Only change code below this line.",
"",
"",
"",
2015-08-16 19:34:11 -07:00
"// Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return array;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id":"cf1111c1c15feddfaeb8bdef",
2015-08-16 19:34:11 -07:00
"title":"Condense arrays with .reduce",
"difficulty":0,
"description":[
"Reduce can be useful for condensing an array or numbers into one value.",
2015-08-16 04:05:15 -07:00
"<code>var singleVal = array.reduce(function(previousVal, currentVal){</code>",
2015-08-27 22:18:09 +02:00
"<code>&thinsp;&thinsp;return previousVal+currentVal;</code>",
"<code>});</code>"
],
"tests":[
"assert(singleVal == 30, 'message: <code>singleVal</code> should have been set to the result of your reduce operation.');",
"assert(editor.getValue().match(/\\.reduce\\s*\\(/gi), 'message: You should have made use of the reduce method.');"
],
"challengeSeed":[
"var array = [4,5,6,7,8];",
"var singleVal = 0;",
2015-08-16 19:34:11 -07:00
"// Only change code below this line.",
"",
"",
"",
2015-08-16 19:34:11 -07:00
"// Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return singleVal;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id":"cf1111c1c15feddfaeb9bdef",
2015-08-16 19:34:11 -07:00
"title":"Filter Arrays with .filter",
"difficulty":0,
"description":[
"filter is a useful method that can filter out values that don't match a certain criteria",
2015-08-17 14:11:49 +01:00
"Let's remove all the values greater than five",
2015-08-16 04:05:15 -07:00
"<code>array = array.filter(function(val) {</code>",
"<code>&thinsp;&thinsp;return val <= 5;</code>",
2015-08-16 04:05:15 -07:00
"<code>});</code>"
],
"tests":[
"assert.deepEqual(array, [1,2,3,4], 'message: You should have removed all the values from the array that are greater than 4.');",
"assert(editor.getValue().match(/array\\.filter\\s*\\(/gi), 'message: You should be using the filter method to remove the values from the array.');",
"assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7\\,8\\,9\\,10\\]/gi), 'message: You should only be using <code>.filter</code> to modify the contents of the array.');"
],
"challengeSeed":[
"var array = [1,2,3,4,5,6,7,8,9,10];",
2015-08-16 19:34:11 -07:00
" // Only change code below this line.",
"",
"",
"",
2015-08-16 19:34:11 -07:00
" // Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return array;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id":"cf1111c1c16feddfaeb1bdef",
2015-08-16 19:34:11 -07:00
"title": "Sort Arrays with .sort",
"difficulty":0,
"description":[
"You can use the method sort to easily sort the values in the array alphabetically or numerically",
2015-08-16 04:05:15 -07:00
"<code>var array = [1,3,2];</code>",
"<code>array = array.sort();</code>",
"This will return <code>[1, 2, 3]</code>"
],
"tests":[
"assert.deepEqual(array, ['alpha', 'beta', 'charlie'], 'message: You should have sorted the array alphabetically.');",
"assert(editor.getValue().match(/\\[\\'beta\\'\\,\\s\\'alpha\\'\\,\\s'charlie\\'\\];/gi), 'message: You should be sorting the array using sort.');",
"assert(editor.getValue().match(/\\.sort\\s*\\(\\)/gi), 'message: You should have made use of the sort method.');"
],
"challengeSeed":[
"var array = ['beta', 'alpha', 'charlie'];",
2015-08-16 19:34:11 -07:00
"// Only change code below this line.",
"",
"",
"",
2015-08-16 19:34:11 -07:00
" // Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return array;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id": "cf1111c1c16feddfaeb2bdef",
2015-08-16 19:34:11 -07:00
"title": "Reverse Arrays with .reverse",
"description": [
2015-08-16 04:05:15 -07:00
"You can use the <code>.reverse()</code> function to reverse the contents of an array."
],
"tests": [
"assert.deepEqual(array, [7,6,5,4,3,2,1], 'message: You should reverse the array.');",
"assert(editor.getValue().match(/\\.reverse\\s*\\(\\)/gi), 'message: You should use the reverse method.');",
"assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7/gi), 'message: You should return <code>[7,6,5,4,3,2,1]</code>.');"
],
"challengeSeed": [
"var array = [1,2,3,4,5,6,7];",
2015-08-16 19:34:11 -07:00
" // Only change code below this line.",
"",
"",
"",
2015-08-16 19:34:11 -07:00
" // Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return array;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType": 1,
"type": "waypoint"
},
{
"id": "cf1111c1c16feddfaeb3bdef",
2015-08-16 19:34:11 -07:00
"title": "Concatenate Strings with .concat",
"description": [
2015-08-16 04:05:15 -07:00
"<code>.concat()</code> can be used to merge the contents of two arrays into one.",
"<code>array = array.concat(otherArray);</code>"
],
"tests": [
"assert.deepEqual(array, [1,2,3,4,5,6], 'You should concat the two arrays together.');",
"assert(editor.getValue().match(/\\.concat\\s*\\(/gi), 'message: You should be use the concat method to merge the two arrays.');",
"assert(editor.getValue().match(/\\[1\\,2\\,3\\]/gi) && editor.getValue().match(/\\[4\\,5\\,6\\]/gi), 'message: You should only modify the two arrays without changing the origional ones.');"
],
"challengeSeed": [
"var array = [1,2,3];",
"",
"var concatMe = [4,5,6];",
2015-08-16 19:34:11 -07:00
"// Only change code below this line.",
"",
"",
"",
2015-08-16 19:34:11 -07:00
"// Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return array;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType": 1,
"type": "waypoint"
},
{
"id":"cf1111c1c16feddfaeb4bdef",
2015-08-16 19:34:11 -07:00
"title":"Split Strings with .split",
"difficulty":0,
"description":[
2015-08-16 04:05:15 -07:00
"You can use the <code>.split()</code> method to split a string into an array.",
"split uses the argument you give to to split the string.",
"<code>array = string.split(' ');</code>"
],
"tests":[
"assert(typeof(array) === 'object' && array.length === 5, 'message: You should split the string by its spaces.');",
"assert(/\\.split\\(/gi, 'message: You should use the split method on the string.');"
],
"challengeSeed":[
"var string = \"Split me into an array\";",
2015-08-16 19:34:11 -07:00
"// Only change code below this line.",
"",
"var array = string;",
"",
2015-08-16 19:34:11 -07:00
"// Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return array;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
},
{
"id":"cf1111c1c16feddfaeb5bdef",
2015-08-16 19:34:11 -07:00
"title":"Join Strings with .join",
"difficulty":0,
"description":[
2015-08-16 04:05:15 -07:00
"We can use the <code>.join()</code> method to join each element in an array into a string separated by whatever delimiter you provide as an argument to the join operation.",
"<code>var joinMe = joinMe.join(\" \");</code>"
],
"tests":[
"assert(typeof(joinMe) === 'string' && joinMe === \"Split me into an array\", 'message: You should join the arrays by their spaces.');",
"assert(/\\.join\\(/gi, 'message: You should use of the join method on the array.');"
],
"challengeSeed":[
"var joinMe = [\"Split\",\"me\",\"into\",\"an\",\"array\"];",
2015-08-16 19:34:11 -07:00
"// Only change code below this line.",
"",
"joinMe = joinMe;",
"",
2015-08-16 19:34:11 -07:00
"// Only change code above this line.",
2015-08-27 22:18:09 +02:00
"(function() {return joinMe;})();"
],
2015-08-16 04:05:15 -07:00
"challengeType":1,
"type": "waypoint"
}
]
}