--- id: 587d7b88367417b2b2512b45 title: Write Higher-Order Arrow Functions challengeType: 1 --- ## Description
It's time to look at higher-order functions and their common pair, arrow functions. Arrow functions work really well when combined with higher-order functions, such as map(), filter(), and reduce().
But what are these functions? Lets look at the simplest example forEach(), and run it on the following array of sample Facebook posts.
let FBPosts = [
{thumbnail: "someIcon", likes:432, shares: 600},
{thumbnail: "Another icon", likes:300, shares: 501},
{thumbnail: "Yet another", likes:40, shares: 550},
{thumbnail: null, likes: 101, shares:0},
]
Of the two forEach() versions below, both perform the exact same log function, and each takes an anonymous callback with a parameter post. The difference is the syntax. One uses an arrow function and the other does not.
ES5
FBpost.forEach(function(post) {
console.log(post) // log each post here
});
ES6
FBpost.forEach((post) => {
console.log(post) // log each post here
});
filter() is very similar. Below it will iterate over the FBPosts array, perform the logic to filter out the items that do not meet the requirements, and return a new array, results.
let results = arr1.filter((post) => { return post.thumbnail !== null && post.likes > 100 && post.shares > 500 });

console.log(results); // [{thumbnail: "someIcon", likes: 432, shares: 600}, {thumbnail: "Another icon", likes: 300, shares: 501}]
## Instructions
Use arrow function syntax to compute the square of only the positive integers (decimal numbers are not integers) in the array realNumberArray and store the new array in the variable squaredIntegers.
## Tests
```yml tests: - text: squareList should be a function. testString: assert.typeOf(squareList, 'function'), 'squareList should be a function'; - text: squareList should be a constant variable (by using const). testString: getUserInput => assert(getUserInput('index').match(/const\s+squaredIntegers/g), 'squaredIntegers should be a constant variable (by using const).'); - text: function keyword was not used. testString: getUserInput => assert(!getUserInput('index').match(/function/g), 'function keyword was not used.'); - text: loop should not be used testString: getUserInput => assert(!getUserInput('index').match(/(for)|(while)/g), 'loop should not be used'); - text: map, filter, or reduce should be used testString: getUserInput => assert(getUserInput('index').match(/map|filter|reduce/g), 'map, filter, or reduce should be used'); - text: The function should return an array called squaredIntegers testString: assert(Array.isArray(squaredIntegers), 'squaredIntegers should be an array'); - text: squaredIntegers should be [16, 1764, 36] testString: assert.deepStrictEqual(squaredIntegers, [16, 1764, 36], 'squaredIntegers should be [16, 1764, 36]'); ```
## Challenge Seed
```js const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2]; const squareList = (arr) => { "use strict"; const positiveIntegers = arr.filter((num) => { // add code here }); const squaredIntegers = positiveIntegers.map((num) => { // add code here }); return squaredIntegers; }; // test your code const squaredIntegers = squareList(realNumberArray); console.log(squaredIntegers); ```
## Solution
```js const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2]; const squareList = (arr) => { "use strict"; const positiveIntegers = arr.filter((num) => { return num >= 0 && Number.isInteger(num); // add code here }); const squaredIntegers = positiveIntegers.map((num) => { // add code here return num ** 2; }); // add code here return squaredIntegers; }; // test your code const squaredIntegers = squareList(realNumberArray); ```