Array Methods

A typical question asked in "History of JavaScript" classes where the teacher mistakenly believes they are teaching programming.

Question:

Here is a sample array of credit card numbers:

['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260']

In the sample array above, the digits add up to 49, 81, 81, and 64 respectively. Since there are two which have the same sum, the function should return the last one with that sum, in this case '4252-278893-7978' Things to accomplish:

• Contain all variables and code needed within a function.
• Have that function take one argument which will be an array of credit card number strings.
• Determine the sum of digits for each credit card number.
• Determine which credit card number has the last largest sum of digits.
• Use a return statement to return the required card number in its original form.

I am not quite sure just what this question is intended to test for when an historical solution is given and I am not even going to give the code for the historical version. To solve this historically would involve numerous for loops and if you know how to code a for loop then coding four or five of them isn't really testing anything more than coding one.

This homework question makes way more sense as a modern JavaScript question because then it is actually testing for knowledge of the various array methods - in this case map(), reduce() and filter() all contribute to obtaining the solution.

``````var arr = ['4916-2600-1804-0530', '4779-252888-3972',
'4252-278893-7978', '4556-4242-9283-2260'];

var findMax = function(arr) {
var t = arr.map(function(x) {return x.split('').reduce(
function(b,c){return +c ? +b+(+c) : b;},0);});
var m = Math.max.apply(null,t);
return arr.filter(function(d,e) {return t[e]==m},t);
};

console.log(findMax(arr).pop());
``````

The assignment to 't' adds the digits for each of the credit card numbers skipping the dashes giving us an array of the totals and the assignment to 'm' gets the highest number from that array. The return then passes back an array of all of the entries from the original array where the sum of the digits is equal to the maximum value. We pop the last entry off that array to give the last entry that meets the criteria.