I have figured out how to calculate the value of numbers from a single string, using as an example..
var sum = "13-2-10-7-3".split('-').reduce(function(x, y) {
return parseInt(x)+ parseInt(y);
}); // Value of 35
Im interested in finding the credit card number whose digits sum to the largest number. If more than one has the same largest sum of digits, we want the last one in the list with that sum.
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'
I am stuck trying to figure out how to now apply this to an array of numbers..
Insight would be much appreciated
You could write a maxBy
function, which takes your function as a parameter for determining the maximum element in the array. This would let you easily adapt your code without much work.
var cards = ['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260']; function maxBy(arr, func) { return arr.reduce(function(max, val) { return func(val) >= func(max) ? val : max; }, arr[0]); } function sumCC(card) { return card.split(/-|/).reduce(function(sum, val) { return sum + parseInt(val, 10); }, 0); } console.log(maxBy(cards, sumCC));
This is a useful utility function. The Lodash utility library also provides a _.maxBy
.
Loop over the credit card numbers and check if sum is max store it and continue to loop and store the maximum credit card number and return it:
function max_credit_sum(arr){
max = -1
credit_card = ''
for(ele of arr){
numbers = ele.replace(/-/g, '').split('')
sum = 0
for(num of numbers){
sum += parseInt(num)
}
if(sum >= max){
credit_card = ele
max = sum
}
}
return credit_card
}
// Test
arr = ['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260']
maximum = max_credit_sum(arr)
Its not the most performant, but its simple and quick
var ccs = ['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260'] // FSFL = F*Simple For-Loop var sum = (a, b) => a + b; var largestSum = 0; var largestSumLastIdx = 0; for (let i = 0; i < ccs.length; i++) { let s = ccs[i].split(/-|/).map(Number).reduce(sum, 0); if (s >= largestSum) { largestSum = s; largestSumLastIdx = i; } } console.log("The winner is: " + ccs[largestSumLastIdx])
You might get the card with maximum sum like this;
var cards = ['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260'], cardSums = cards.map(c => c.split("-").reduce((p,c) => +p + +c)), maxCard = cards[cardSums.indexOf(Math.max(...cardSums))]; console.log(maxCard);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.