2016-08-03 4 views
1

ich herausgefunden habe, wie man den Wert von Zahlen aus einer Zeichenfolge zu berechnen, als Beispiel ..Wie in Array gespeichert Summe der Zahlen in einem String finden

var sum = "13-2-10-7-3".split('-').reduce(function(x, y) { 
    return parseInt(x)+ parseInt(y); 
}); // Value of 35 

Ich bin interessiert an die Kreditkarte zu finden, Nummer, deren Ziffern die größte Zahl ergeben. Wenn mehr als einer die gleiche größte Anzahl an Ziffern hat, wollen wir den letzten in der Liste mit dieser Summe.

Hier ist ein Beispiel Array von Kreditkartennummern:

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

In der Probenreihe über, fügen die Ziffern 49 bis 81, 81, bzw. 64. Da es zwei sind, die die gleiche Summe haben, sollte die Funktion die letzte mit dieser Summe zurückgeben, in diesem Fall '4252-278893-7978'

ich stecken bin versucht, wie jetzt, um herauszufinden, diese Zahlen auf ein Array anwenden ..

  1. Enthalten alle Variablen und Code innerhalb einer Funktion benötigt.
  2. Haben Sie diese Funktion nehmen Sie ein Argument, das eine Reihe von Kreditkartennummer Zeichenfolgen sein wird.
  3. Bestimmen Sie die Summe der Ziffern für jede Kreditkartennummer.
  4. Bestimmen Sie, welche Kreditkartennummer die letzte größte Anzahl an Ziffern hat.
  5. eine return-Anweisung Verwenden Sie die gewünschte Kartennummer in seiner Urform

Insight würde sehr geschätzt

Antwort

1

Schleife über die Kreditkartennummern zurückkehren und prüfen, ob Summe es max Speicher ist und weiterhin Schleife und speichern Sie die maximale Anzahl Kreditkarte und senden Sie es:

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

Sie eine maxBy Funktion schreiben könnte, die zur Bestimmung der maximalen Element in dem Feld Ihre Funktion als Parameter übernimmt. Auf diese Weise können Sie Ihren Code ohne großen Aufwand anpassen.

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

Dies ist eine nützliche Hilfsfunktion. Die Lodash-Dienstprogrammbibliothek stellt außerdem eine _.maxBy bereit.

+0

Der Code, um die CC-Nummern an den Strichen aufbricht und versucht, diese Stücke nicht die einzelnen Ziffern zu addieren. Es findet nie die tatsächlichen Ziffern und findet niemals die Kreditkartennummer mit der letzten größten Ziffernsumme.Ich überlegte, eine Schleife zu schreiben, um durch jede Kreditkartennummer zu iterieren und dann eine verschachtelte Schleife zu verwenden, um jedes Zeichen in der Zeichenfolge zu durchlaufen, während die Zahlen addiert werden (keine Bindestriche). Behalten Sie dann den Index desjenigen mit der größten Summe von Ziffern im Auge, damit Sie den tatsächlichen Kreditkartenstring mit der letzten größten Summe zurückgeben können. –

+0

Möchten Sie die Zahlen zwischen den Bindestrichen addieren, anstatt die Ziffern zusammenzufassen? In Ihrem Beispiel sagten Sie, die Summe sei 49, 81 und 64. Ich kann das ändern, indem ich '/ - /' anstelle von '/ - | /' verwende. – 4castle

+0

Hat mein Code die falsche Ausgabe? Ich bin verwirrt, wenn du mit "dem Code" deinen oder meinen meinst. – 4castle

0

Es ist nicht die performant, aber seine einfache und schnelle

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

+1

'Split' nimmt eine Regex als Parameter, so dass '' -'' das gleiche wie'/-/'ist. Sie können den Split-> Join-> Split zu Split (/ - | /) ' – 4castle

+0

ah, Sie haben Recht .. thx – webdeb

+0

Dies hat den falschen Ausgang. Es gibt nicht das letzte Element mit dem maximalen Wert zurück. – 4castle

0

Sie können die Karte mit einer maximalen Summe wie diese erhalten;

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

Verwandte Themen