2016-04-10 2 views
-1

Я заинтересован в поиске номера кредитной карты, цифры которой составляют наибольшее количество. Если более одной цифры имеют одну и ту же самую большую сумму цифр, я хочу, чтобы последняя была в списке с этой суммой.Поиск максимальной суммы в массиве номеров кредитных карт

Я пытаюсь написать одну функцию, которая принимает один аргумент. Этот аргумент будет массивом номеров кредитных карт. Предположим, что в массиве может быть любое количество номеров кредитных карт, и каждый из них представляет собой строку цифр и тире. Функция должна вернуть номер кредитной карты с наибольшей суммой цифр.

Вот что я так далеко

var creditCardNumbers = ['5865-2600-5889-0555', '4779-598666-3666', '4252-278553-7978' ,'4556-4242-9283-2260']; 

var sums = creditCardNumbers.map(function(f) { 
return f.match(/\d/g).reduce(function(sum, num) { 
    return sum + parseInt(num); 
}, 1); 
}); 
var maxSum = Math.max.apply(Math, sums); 


console.log("totalSums = " + (sums)); 
console.log("maxSum = " + maxSum); 
console.log("Number with the highest sum: " + (sums.creditCardNumbers)); 
//This last console.log does not work 

У меня возникают проблемы, возвращая соответствующий номер кредитной карты с самой высокой суммой. Если у кого-то есть советы о том, как достичь этой проблемы, их собственный путь - это здорово. Заранее спасибо!

+1

Возможно, что-то вроде 'creditCardNumbers.reduce (..., {cc: undefined, max: 0}). Cc'? – jlowcs

+1

(Я позволил вам выяснить остальное;)) – jlowcs

+0

Надеюсь, это всего лишь тест и не указывает на какой-либо фактический производственный код, который вы используете. – Andy

ответ

0

Если проблема только в «возвращения соответствующий номер кредитной карты с самой высокой суммой», то почему бы просто не сделать следующую простую вещь: (? Или я что-то отсутствует)

... 
console.log("Number with the highest sum: " + (creditCardNumbers[sums.indexOf(maxSum)])); 
// Number with the highest sum: 4779-598666-3666 

1

Ваш код может выглядеть следующим образом

var ccn = ['5865-2600-5889-0555', '4779-598666-3666', '4252-278553-7978' ,'4556-4242-9283-2260'], 
filtered = [], 
ccnSums = ccn.map(e => Array.prototype.reduce.call(e.replace(/-/g,""), (p,c) => 1*p+1*c)); 
ccnSums.forEach((e,i,a) => a.lastIndexOf(e) == i && filtered.push(e)); 

Так из приведенных данных возвращает ccnSums как [77, 88, 74, 64] и filtered также [77, 88, 74, 64], однако, если я изменю третью кредитную карту № на «4255-278553-7978», тогда она возвращает ccnSums как [77, 88, 77, 64], а теперь filtered - [88, 77, 64]. Надеюсь, это было то, что вы хотели.

+1

'.replace()' возвращает массив, поэтому вам не нужен 'Array.prototype.map.call'. Просто сделайте 'e.replace (...). Map (...)'. Или просто устраните это внутреннее '.map() ' –

+0

Спасибо, что вы правы .. исправлены соответственно. Теперь все должно быть хорошо. – Redu

+0

То же самое с '.reduce()'. Вы можете вызвать его прямо на возвращаемое значение '.replace()' вместо того, чтобы делать 'Array.prototype.reduce.call'. –

1

Вот обновленный код:

var creditCardNumbers = ['5865-2600-5889-0555', '4779-598666-3666', '4252-278553-7978' ,'4556-4242-9283-2260']; 

var sums = creditCardNumbers.map(function(f) { 
return f.match(/\d/g).reduce(function(sum, num) { 
return sum + parseInt(num); 
}, 1); 
}); 
var maxSum = Math.max.apply(Math, sums); 


console.log("totalSums = " + (sums)); 
console.log("maxSum = " + maxSum); 
console.log("Number with the highest sum: " + (creditCardNumbers[sums.indexOf(maxSum)])); 
or, 
console.log("Number with the highest sum: " + (creditCardNumbers[sums.indexOf(Math.max(...sums))])); 
0

Попробуйте сделать следующие два исправления:

1) Не передавайте начальное значение для массива метода сокращения. Вы передаете необязательное значение инициализации 1. Не нужно

2) Вы уже рассчитали максимальную сумму. Все, что вам нужно сделать, это найти индекс этой максимальной суммы из массива сумм и использовать этот индекс, чтобы найти номер кредитной карты из исходного массива. Массивы предоставляют метод под названием «indexOf». Если есть несколько номеров кредитных карт с одинаковой суммой, вы хотите, чтобы последний из них был в списке. Поэтому используйте другую версию функции IndexOf, называемую lastIndexOf.

Вот как ваша окончательная программа будет выглядеть следующим образом:

var creditCardNumbers = ['5865-2600-5889-0555', '4779-598666-3666', '4252- 278553-7978' ,'4556-4242-9283-2260']; 

var sums = creditCardNumbers.map(function(f) { 
    return f.match(/\d/g).reduce(function(sum, num) { 
     return sum + parseInt(num); 
    }); 
}); 
var maxSum = Math.max.apply(Math, sums); 

console.log("totalSums = " + (sums)); 
console.log("maxSum = " + maxSum); 
var index = sums.lastIndexOf(maxSum.toString()); 
console.log("Number with the highest sum: " + creditCardNumbers[index]); 
0

Это может быть еще один способ сделать.

var a = ["5865-2600-5889-0555", "4779-5989-9666-3666", "4252-278553-7978", "4556-4242-9283-2260"] 

function yourFunction (array){ 
var temp = _.reduce(arr,function(acc, v) { 
    acc[v] = _.sumBy(v, function (v) { 
    return !_.isNaN(parseInt(v)) ? parseInt(v) : 0; 
    }); 
    return acc; 
},{}); 
return _.invert(temp)[_.max(_.values(temp))]; 
} 
Смежные вопросы