2016-06-22 18 views
2

Beginning JavaScript Lerner hier ...Summe der Inhalt eines JavaScript-Array

Ich arbeite durch Adrian Neumann Simple Programming Problems und meine Frage ist, Nummer 5 in den elementaren Übungen.

Schreiben Sie ein Programm, das den Benutzer nach einer Zahl n fragt und die Summe der Zahlen 1 bis n ... ausgibt, so dass nur Vielfache von 3 und 5 berücksichtigt werden.

Hier ist mein Code, wie es derzeit steht ...

var myArray = []; 
var mySum = 0; 

var userNum = prompt("What is your number? "); { 
    for (var i = userNum; i > 0; i--) { 
     if (i % 5 === 0 || i % 3 === 0) { 
      mySum += myArray.push(i); 
     } 
    } 
} 
console.log(mySum); 

Dies führt zu dem Ergebnis 28, die nicht korrekt ist. Wenn ich die mySum Anweisung auskommentiere und das Array für die Eingabe von 17 drucke, bekomme ich [15, 12, 10, 9, 6, 3], die richtig aussieht.

Ich wäre an Tipps interessiert, warum die mySum-Anweisung nicht das erwartete Ergebnis liefert. Ich wäre auch an allen Tipps interessiert, um den Code effizienter zu machen. Danke vielmals!

bearbeiten
Für alle Interessierten, hier ist der Code, den ich für die beste zu sein ließ sich auf für meine Zwecke und aktuelle Niveau:

var mySum = 0; 

var userNum = prompt("What is your number? "); 
for (var i = userNum; i > 0; i--) { 
    if (i % 5 === 0 || i % 3 === 0) { 
     mySum += +i; // type coercion with unary operator 
    } 
} 
console.log(mySum); 

Vielen Dank an alle!

+3

Warum Array? 'mySum + = i;' oder wenn du willst: 'mySum + = i; myArray.push (i); 'oder' myArray.push (i); 'und anschließend das Array reduzieren:' sum = myArray.reduce (Funktion (a, b) { Rückgabe a + b; }); ' – mplungjan

+4

Array.prototype.push gibt die neue Länge des Arrays und nicht den von Ihnen angegebenen Wert zurück, weshalb Ihre Summe nicht korrekt ist. – Lee

+0

Beachten Sie, dass die äußeren '{...}' nicht notwendig sind. –

Antwort

3

Da myArray.push (i) nicht die Zahl zurückgibt, die Sie gedrückt haben, sondern die aktuelle Länge des Arrays, ist Ihre Summe nicht das, was Sie erwarten.

Verwenden Sie stattdessen mySum += i;

oder wenn Sie wollen immer noch das Array verwenden, um späteren Prozess/console.log die einzelnen Zahlen:

mySum += i; 
myArray.push(i); 

oder nur myArray.push(i); und danach das Array reduzieren:

sum = myArray.reduce(function(a, b) { 
    return a + b; 
}); 

Hier auch ich die Zeichenfolge, die Sie erhalten, wenn Sie zur Eingabe einer Nummer und entfernen Sie die Verpackung { } whi ch sind nicht erforderlich

var myArray = []; 
 
var mySum = 0; 
 

 
var userNum = prompt("What is your number? "); 
 
for (var i = +userNum; i > 0; i--) { 
 
    if (i % 5 === 0 || i % 3 === 0) { 
 
    mySum += i; 
 
    myArray.push(i); 
 
    } 
 
} 
 
console.log(mySum,myArray);

Alternative mit reduce - es ist wahrscheinlich viel des Guten in Ihrem Fall, aber ich schließe es der Vollständigkeit halber:

var myArray = []; 
 
var mySum = 0; 
 

 
var userNum = prompt("What is your number? "); 
 
for (var i = +userNum; i > 0; i--) { 
 
    if (i % 5 === 0 || i % 3 === 0) { 
 
    myArray.push(i); 
 
    } 
 
} 
 
mySum = myArray.reduce(function(a, b) { 
 
    return a + b; 
 
}); 
 

 

 
console.log(mySum, myArray);

+0

Das sieht nach einer entzückenden Antwort aus, aber ein wenig fortgeschrittener als mein gegenwärtiges Verständnisniveau. Was sind die Vorteile der reduce-Methode? (Ich bin ein totaler Anfänger wie zuvor erwähnt). Vielen Dank. – zeitchef

+0

Das erste Beispiel wird tun, was Sie brauchen. Das Reduzieren ist eine elegante Möglichkeit, einige Manipulationen an einem Array zurückzugeben: [Dokumentation] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) - möglicherweise ein bisschen von einem Overkill in deinem Fall, da du sowieso eine Schleife hast. – mplungjan

3

Überprüfen Sie die Dokumentation für Array.push. Es heißt: "Gibt die neue Längeneigenschaft des Objekts zurück, auf dem die Methode aufgerufen wurde."

Das bedeutet, dass Sie jedes Mal, wenn Sie mySum += myArray.push(i) anrufen, sagen Sie mySum += myArray.length (nachdem Sie i geschoben haben).

Stattdessen sollten Sie nur hinzufügen i zu mySum:

mySum += i 

statt

mySum += myArray.push(i) 

In Bezug auf dem besseren Code, ich mit mplungjan zustimmen - Array.reduce ein guter sein würde zu verwenden, Hier.

Bearbeiten: Eigentlich, da Sie nicht mit einem Array, sondern eine Zahl beginnen, in diesem Fall ist eine for-Schleife wahrscheinlich die schnellste und sauberste Möglichkeit, um Ihr Ergebnis zu erhalten.

0

Betrachten Sie den folgenden optimierte Ansatz "negative" while Schleife:

var userNum = prompt("What is your number? "), 
    mySum = 0; 

while (userNum--) { 
    if (userNum && (userNum % 5 === 0 || userNum % 3 === 0)) { 
     mySum += userNum; 
    } 
} 
console.log(mySum); // 60 
0

A "nur Mathematik" (keine Schleife) Option. Dies ist besser für größere Zahlen als eine Schleife.

var a = parseInt(prompt('What is your number?')); 
var five = Math.floor(a/5); 
var three = Math.floor(a/3); 
// if values like 15 are counted twice, remove 'both' 
// otherwise this is required to remove the doubling up. 
var both = Math.floor(a/15); 

var result = (multiple(five) * 5) 
    result += (multiple(three) * 3); 
    // remove these results if "15" is counted only once 
    result -= (multiple(both) * 15); 

// this is the tricky party. 
function multiple(x) { 
    return (((x + 1)/2) * x); 
} 

console.log('result:['+ result +']'); 
console.log('a:['+ a +'] 3:['+ three +'], 5:['+ five +'], 15:['+ both +']'); 

HINWEIS: Keine Überprüfung, ob die Eingabe eine Zahl ist.