2016-04-10 17 views
-1

Ich bin daran interessiert, die Kreditkartennummer zu finden, deren Ziffern die größte Zahl ergeben. Wenn mehr als einer dieselbe größte Ziffernsumme hat, möchte ich den letzten in der Liste mit dieser Summe haben.Max. Summe in Array von Kreditkartennummern finden

Ich versuche, eine einzige Funktion zu schreiben, die ein Argument benötigt. Dieses Argument wird eine Reihe von Kreditkartennummern sein. Angenommen, das Array kann eine beliebige Anzahl von Kreditkartennummern haben und jede ist eine Folge von Ziffern und Bindestrichen. Die Funktion sollte die Kreditkartennummer zurückgeben, die die größte Ziffernsumme aufweist. Hier

ist, was ich habe so weit

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 

Ich habe Probleme, die entsprechenden Kreditkartennummer mit der höchsten Summe zurück. Wenn jemand Ratschläge hat, wie man dieses Problem auf seine eigene Weise erreicht, ist das großartig. Danke im Voraus!

+1

Vielleicht etwas wie 'creditCardNumbers.reduce (..., {cc: undefined, max: 0}). Cc'? – jlowcs

+1

(Ich lasse Sie den Rest herausfinden;)) – jlowcs

+0

Ich hoffe, dass dies nur ein Test ist und keinen Hinweis auf tatsächlichen Produktionscode Sie verwenden. – Andy

Antwort

0

Wenn das Problem nur in ist, warum dann einfach nicht tun das folgende einfache Sache „die entsprechende Kreditkartennummer mit der höchsten Summe Rückkehr“: (? Oder bin ich etwas fehlt)

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

1

könnte der Code wie folgt aus den gegebenen Daten So

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)); 

aussehen eskehrtals [77, 88, 74, 64] und filtered ist auch [77, 88, 74, 64] aber wenn ich die 3. Kreditkarte Nr. Zu "4255-278553-7978" dann ändere, gibt es ccnSums als [77, 88, 77, 64] zurück und jetzt ist die filtered[88, 77, 64]. Ich hoffe, das war was du wolltest. Hier

+1

'.replace()' gibt ein Array zurück, so dass Sie nicht brauchen 'Array.prototype.map.call'. Einfach 'e.replace (...). Map (...)'. Oder eliminiere einfach das innere '.map() ' –

+0

Danke, dass Sie richtig sind .. korrigiert entsprechend. Jetzt sollte alles in Ordnung sein. – Redu

+0

Gleiches mit '.reduce()'. Sie können es direkt auf dem Rückgabewert von '.replace()' aufrufen, anstatt 'Array.prototype.reduce.call' auszuführen. –

1

ist der aktualisierte Code:

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

Versuchen Sie, die folgenden zwei Korrekturen vorzunehmen:

1) Geben Sie es nicht ein Anfangswert auf die Array-Verfahren reduzieren. Sie übergeben einen optionalen Initialisierungswert von 1. Es wird nicht benötigt

2) Sie haben die maximale Summe bereits herausgefunden. Alles, was Sie tun müssen, ist, den Index dieser maximalen Summe aus dem Array Summen zu finden und diesen Index zu verwenden, um die Kreditkartennummer aus dem ursprünglichen Array zu finden. Arrays bieten eine Methode namens "indexOf". Falls mehrere Kreditkartennummern mit der gleichen Summe vorhanden sind, möchten Sie die letzte in der Liste haben. Verwenden Sie also eine andere Version der IndexOf-Funktion namens lastIndexOf.

Hier ist, wie Sie Ihr endgültiges Programm aussehen wird:

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

Dies könnte eine andere Art und Weise zu tun.

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))]; 
}