JavaScript Total返回NaN

时间:2016-07-16 11:36:48

标签: javascript arrays sum

我正在尝试使用JavaScript对一组对象求和,但不显示86的预期结果,而是显示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;

4 个答案:

答案 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 :(得分:2)

您的第一个数据点是{"ID":"--"}

您无法添加--并从中获取整数。

"--" + 1NaN

如果您希望此返回实际数字,则必须添加实际数字

更新

如果您需要检查值,请在循环中使用parseIntisNaN


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

答案 2 :(得分:0)

您可以使用isNaN类型检查检查任何值的有效性(表示不是数字)。如果ID是数字或字符串编号,则类型检查器将返回false。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 3 :(得分: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>