2016-07-16 105 views
3

我正在嘗試使用JavaScript對一個數組對象進行求和,但不是顯示86的預期結果,而是顯示NaN。我不能編輯對象的數組!JavaScript總回報NaN

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/

請注意,這不是Object returning NaN when sum values重複,因爲我已經擁有的代碼行var sum = 0;

回答

6

你可以插入一個檢查值是否爲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

不知道'isFinite';好的提示:) –

2

你的第一個數據點爲{"ID":"--"}

不能添加--並從中得到一個整數。

"--" + 1NaN

,如果你希望它返回一個實際數目,您必須添加實際數字


更新

如果你需要檢查值,使用

parseIntisNaN在你的圈內


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

我明白了。我無法編輯對象數組,只能編輯它之後的代碼。有沒有辦法解決這個問題,同時保留'{「ID」:「 - 」}'? –

+0

你將不得不使用'parseInt'和'isNaN'來檢查它是否是一個有效值 –

+0

@TheCodesee,3 utils:'function float(v){return + v || 0} function int(v){return v | 0}函數uint(v){return v >>> 0}'然後'sum + = float(id [i] .ID)'例如 – Thomas

0

您可以使用isNaN類型檢查(手段不是數字)檢查任何值的有效性。如果ID是數字或字符串編號,類型檢查器將返回false。

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

使用Number構造,isNan功能和documentFragment使得僅一個環而不是兩個)的優化版本:

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>