1st Example
In this example, I have a JSON array, with few objects in it. I want to calculate the sum of all the marks obtained a student in various subjects.
<script> let total_marks = () => { const student = '[{"subject":"science", "marks": 87}, ' + '{"subject":"math", "marks": 82}, ' + '{"subject":"sanskrit", "marks": 91}]'; const arr = JSON.parse(student); const arrMarks = arr.map(students => students.marks); // get all the marks. const result = arrMarks.reduce(sum, 0); // now calculate the sum. document.write ('total marks: ' + result); } // return the sum. let sum = (prev, cur) => { return prev + cur; } total_marks(); </script>
Here, I am using two methods. The map() method followed by the reduce() method.
The map() extracts all marks from the JSON and stores the data it in an array.
The reduce() runs a callback function named sum() and returns the total marks obtained.
👉 By the way, you can write the above code using an Arrow function.
<script> let total_marks = () => { const student = '[{"subject":"science", "marks": 87}, ' + '{"subject":"math", "marks": 82}, ' + '{"subject":"sanskrit", "marks": 91}]'; const arr = JSON.parse(student); // get all the marks. const arrMarks = arr.map(students => students.marks); const result = arrMarks.reduce((prev, cur) => prev + cur); // using arrow function (short and sweet). document.write ('total marks obtained: ' + result); } total_marks(); </script>
Ok, don't want to use the map() method? No problem. You can run a similar code using only the reduce() method on a JSON object. See the 2nd example.
2nd Example
Here I have a JSON object with two values, name and type (of birds). I’ll use reduce() method to get a particular type of birds from the JSON object.
<body> <div id='result'></div> <!-- show result here. --> </body> <script> let b = ''; let get_bird_type = () => { const data = {"birds": [ { "name": "Bald Eagle", "type": "Hawk" }, { "name": "Rock Pigeon", "type": "Dove" }, { "name": "Black Vulture", "type": "Hawk" } ]}; const result = data.birds.reduce(btype, 0); let cont = document.getElementById('result'); cont.innerHTML = result; // output: Bald Eagle, Black Vulture } // callback function let btype = (prev, bird) => { if (bird.type === 'Hawk') { // check type of bird. Change bird type and check. b = b + bird.name + '<br />'; } return b; // return bird name. } get_bird_type(); </script>
When the callback function is invoked, it checks the bird type using a condition and accordingly returns the result as a single value.
So, if the condition is Hawk, it stores the name of all the birds of type Hawk in a variable and returns.
Alternatively, you can write the above code using Arrow function.
<script> let b = ''; let get_bird_type = () => { const data = {"birds": [ { "name": "Bald Eagle", "type": "Hawk" }, { "name": "Rock Pigeon", "type": "Dove" }, { "name": "Black Vulture", "type": "Hawk" } ]}; // using Arrow function. const result = data.birds.reduce((prev, cur) => cur.type === 'Dove' ? b = b + cur.name + '<br />' : b, ''); // output: Rock Pigeon let cont = document.getElementById('result'); cont.innerHTML = result; } get_bird_type(); </script>
The Arrow (=>) function has an advantage. Just a one-line code performs the whole task.
Also, see how I am using the ternary operator with the Arrow function, to reduce the array into a single value.