2016-07-16 10 views
3

Ich versuche ein Array von Objekten mit JavaScript zu summieren, aber anstatt das erwartete Ergebnis von 86 anzuzeigen, wird NaN angezeigt.JavaScript Total Returns NaN

Hinweis: Ich kann das Array von Objekten nicht bearbeiten!

var objects = [{"ID":"--"},{"ID":"58"},{"ID":"28"}]; 
 

 
var sum = 0; 
 
id = objects; 
 
for (var i = 0; i < id.length; i++) { 
 
    sum += +id[i].ID; 
 
} 
 

 
document.getElementById('here').innerHTML = "<b>Total:</b>" + sum; 
 
objects.forEach(function(key) { 
 
    var a = document.createElement("p"); 
 
    a.innerHTML = key.ID; 
 
    document.getElementById('here').appendChild(a); 
 
});
<div id="here"></div>

JsFiddle: https://jsfiddle.net/ru266x7m/

Bitte beachten Sie, dass dies nicht ein Duplikat Object returning NaN when sum values ist, wie ich bereits die Codezeile haben var sum = 0;

Antwort

6

Sie ein einfügen könnte Überprüfen Sie, ob der Wert isFinite.

if (isFinite(id[i].ID)) { 
    sum += +id[i].ID; 
} 

var objects = [{"ID":"--"},{"ID":"58"},{"ID":"28"}]; 
 

 
var sum = 0; 
 
id = objects; 
 
for (var i = 0; i < id.length; i++) { 
 
    if (isFinite(id[i].ID)) { 
 
     sum += +id[i].ID; 
 
    } 
 
} 
 

 
document.getElementById('here').innerHTML = "<b>Total: </b>" + sum; 
 
objects.forEach(function(key) { 
 
    var a = document.createElement("p"); 
 
    a.innerHTML = key.ID; 
 
    document.getElementById('here').appendChild(a); 
 
});
<div id="here"></div>

+1

wusste nicht über 'isFinite'; guter Tipp :) –

2

Ihren ersten Datenpunkt ist {"ID":"--"}

Sie nicht -- hinzufügen und eine ganze Zahl von ihm erhalten.

"--" + 1 ist NaN

, wenn Sie dies wollen eine tatsächliche Zahl zurück, Sie tatsächlichen Zahlen


Update

hinzufügen müssen, wenn Sie benötigen, um die Werte zu überprüfen, verwenden Sie parseInt und isNaN innerhalb Ihrer Schleife


var value = parseInt(id[i].ID. 10); 
var valid = isNaN(value); 
if (valid){ 
    sum += value; 
} 
+0

Ich sehe. Ich bin nicht in der Lage, das Array von Objekten zu bearbeiten, nur den Code danach. Gibt es einen Weg um dies zu erreichen, während man '{" ID ":" - "}'? –

+0

müssten Sie 'parseInt' und' isNaN' verwenden, um zu überprüfen, ob es sich um einen gültigen Wert handelt –

+0

@TheCodesee, 3 utils: 'Funktion float (v) {return + v || 0} Funktion int (v) {return v | 0} Funktion uint (v) {return v >>> 0} 'und dann' sum + = float (id [i] .ID) 'zum Beispiel – Thomas

0

Sie können die Gültigkeit eines beliebigen Werts mit isNaN Typ überprüfen (Mittel ist keine Nummer). Type Checker gibt false zurück, wenn ID die Nummer oder die String-Nummer ist.

var objects = [{"ID":"--"},{"ID":"58"},{"ID":"28"}]; 
 

 
var sum = objects.reduce((s, o) => console.log(o.ID) || s + (isNaN(o.ID) ? 0 : +o.ID), 0); 
 

 
console.log('Total: ' + sum);

0

eine optimierte Version unter Verwendung Number Konstruktor isNan Funktion und documentFragment (nur eine Schleife statt zwei machen):

var objects = [{"ID":"--"},{"ID":"58"},{"ID":"28"}]; 
 

 
var sum = 0, hereEl = document.getElementById('here'), 
 
    f = document.createDocumentFragment(); 
 

 
objects.forEach(function(key) { 
 
    var p = document.createElement("p"), num = Number(key.ID); 
 
    p.innerHTML = key.ID; 
 
    sum += !isNaN(num)? num : 0; 
 
    f.appendChild(p); 
 
}); 
 
hereEl.innerHTML = "<b>Total:</b>" + sum; 
 
hereEl.appendChild(f);
<div id="here"></div>