2017-05-19 3 views
0

Ist es möglich, do{}while() zu verwenden, um dieselbe Var abhängig vom Ergebnis einer anderen Var zu verketten?Schleife und Verkettung derselben VAR

ich eine Schleife laufen lasse, wo ich Kunden und ihre Zahlungen erfassen, jede Zeile ist ein Ergebnis, manchmal für den gleichen Kunden Ich habe 2 oder mehr Zahlungen, das heißt:

Customer A --- 'Payment#01' --- $10.00 Customer A --- 'Payment#02' --- $10.00 Customer B --- 'Payment#01' --- $10.00 Customer B --- 'Payment#02' --- $10.00 Customer B --- 'Payment#03' --- $10.00 [...]

Ich möchte überprüfen der Kunde in der ersten Zeile und while die nächste Zeile fortgesetzt werden mit demselben Kunden ich mag würde jedes Ergebnis in einer Zeichenfolge verketten, also werde ich so etwas wie diese:

Customer A --- 'Payment#01,Payment#02' --- $20.00 Customer B --- 'Payment#01,Payment#02,Payment#03' --- $30.00

[Edit: Code so weit]

try{ 
    do{ 
     resultSet = searchResults.getResults(resultIndex, resultIndex + resultStep); 
     resultIndex = resultIndex + resultStep; 
     for(var i = 0; !!resultSet && i < resultSet.length; i++){ 
      var results = resultSet[i]; 
      var columns = results.getAllColumns(); 
      var customer = results.getValue(columns[0]); 
      var paymentamt = results.getValue(columns[1]); 
      var document = results.getValue(columns[2]); 
     } 
    } while (!!resultSet && resultSet.length > 0) 
} catch(error){ 
    var message = error.message; 
} 

Antwort

0

Wenn die Kunden immer in einem ordentlichen Ordnung sind, das heißt, Sie nicht immer Kunde A erhalten wird, Kunde B, Kunde A, dann benutzen Sie einfach eine variable Strecke zu halten der aktuellen Kundennummer, der aktuellen Zahlungszeichenfolge und des aktuellen Werts.

Schleife durch das Los - ist die Kunden-ID bei [Schleife] die gleiche wie die aktuelle? Wenn ja, füge zur Zeichenkette und zum Wert hinzu. Wenn nicht, Ausgabe (oder was auch immer Sie damit machen) die aktuelle Zeile, setzen Sie alle Variablen auf die Daten dieses neuen Kunden zurück.

Wenn sie ankommen aus der Reihenfolge dann können Sie die Werte in einem Objekt speichern - z. customerRecord = {Kundennummer: {paymentstring :, Wert:}}. Während Sie den nächsten Kunden in der Schleife einlesen, prüfen Sie, ob er im Objekt vorhanden ist (hasOwnProperty, wenn Sie die customerID als Schlüssel verwenden, wie oben) und fügen Sie seine Werte hinzu. Wenn nicht, fügen Sie ein neues Objekt zu customerRecord hinzu.

+0

sollten Sie einen Code zur Verfügung stellen und eine bessere formatierte Version der Schlüsselwert Struktur, um Ihre Antwort besser lesbar zu machen. Ihre Antwort ist richtig, obwohl die Leute es vielleicht tun, weil es wie eine Galle Text statt einer brauchbaren Lösung aussieht. Nur ein Tipp, kein Urteil. – Glubus

+0

Danke @WindsorAndy, Beantworten Sie Ihre Frage: Sie werden immer nacheinander sortiert nach Kunden sortiert. Ich habe eine Idee von dem, was Sie vorgeschlagen, aber ich bin kein Entwickler, ich lerne js lesen Hilfe Dokumentation und Artikel überall, so verstehe ich Ihre Logik, aber mir fehlen für die Syntax diese Schleife zu bauen =/ Dies ist, was ich bisher habe, ich habe bereits eine Schleife, weil ich alle Ergebnisse durchlaufen habe, also stelle ich mir vor, ich brauche eine andere Schleife in: –

0

Der allgemeinste Ansatz besteht darin, ein Objekt mit Schlüsseln oder den moderneren Map zu behalten, um die Summen und alle Zahlungen zu behalten. Der direkteste Ansatz wäre, Objekte beizubehalten und die Zeichenfolge einfach anzuhängen. Eine Alternative besteht darin, die separaten Zahlungen (Beschreibungen) in diesen Objekten zu behalten und sie nur bei der Anzeige zu verketten. Zum Beispiel:

//this part is just for emulating the resultset 
 
let resultSet =[ \t {vals:['Customer A' ,'Payment#01' ,10.00]}, {vals:['Customer A' ,'Payment#02' ,10.00]}, {vals:['Customer B' ,'Payment#01' ,10.00]}, {vals:['Customer B' ,'Payment#02' ,10.00]}, {vals:['Customer B' ,'Payment#03' ,10.00]} ];resultSet.forEach(o=> {o.getAllColumns =()=> [0,1,2]; o.getValue = i => o.vals[i]}); 
 
    
 

 
let map = new Map(); // <- declare outside the do..while , if it should concatenate customers from all searches, otherwise inside 
 
do{ 
 
\t //get result set code... 
 
\t if(!resultSet)break; 
 
    \t for(var i = 0; i < resultSet.length; i++){  
 
      let results = resultSet[i], 
 
      \t columns = results.getAllColumns(); 
 
       \t customer = results.getValue(columns[0]), 
 
      \t tot = map.get(customer); 
 
      if(!tot) map.set(customer,tot = {customer:customer, payments:[], totalAmt:0, get Payments(){return this.payments.join(', ');} , toString: function(){return `${this.customer} --- ${this.Payments} --- ${this.totalAmt}`;}}); 
 
      tot.payments.push(results.getValue(columns[1])); 
 
      tot.totalAmt += results.getValue(columns[2]); 
 
     }  
 
}while(false); //replace with your own while (since break is used, you could simply do while(true)) 
 

 
//test output code. 
 
for(let tot of map.values()) 
 
\t console.log(tot.toString());