2016-07-16 98 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>