对象在返回值时返回NaN

gro*_*426 4 javascript

我承认我在JavaScript和JSON方面很弱.我花了很多时间试图弄清楚为什么我的对象中的数字在加在一起时会返回NaN.考虑到这一点,下面是我的JSON,存储到变量:

var data = [
    {
        "acc_ext_id": null,
        "cat_code": 10002,
        "cat_ds": "REVENUE",
        "category_id": null,
        "chart_id": null,
        "created_at": null,
        "dept_id": null,
        "feb": null,
        "id": null,
        "jan": 30,
        "note": null,
        "total_cost": null,
        "updated_at": null,
        "year_id": null
    },
    {
        "acc_ext_id": "41260-02600",
        "cat_code": 10002,
        "cat_ds": "REVENUE",
        "category_id": 2,
        "chart_id": 2373,
        "created_at": "2013-01-15 16:43:52.169213",
        "dept_id": 86,
        "feb": 45,
        "id": 3,
        "jan": 60,
        "note": "Two",
        "total_cost": 105,
        "updated_at": "2013-01-15 16:43:52.169213",
        "year_id": 1
    }
]
Run Code Online (Sandbox Code Playgroud)

然后我尝试迭代对象并对值求和:

var jan;

for (var i=0;i<data.length;i++){ 
    if(data[i].jan != null){    
        jan += parseFloat(data[i].jan);
        console.log(jan);
    }
}
Run Code Online (Sandbox Code Playgroud)

在控制台中打印出来的是NaN.我试图解析数字并保持原始状态,但无济于事.我的物品有问题吗?这是一个jsFiddle来说明:http://jsfiddle.net/5E2pm/3/

Sir*_*Sir 10

var jan = 0; //this should solve it

for (var i=0;i<data.length;i++){ 
    if(data[i].jan != null){    
        jan += parseFloat(data[i].jan);
        console.log(jan);
    }
}
Run Code Online (Sandbox Code Playgroud)

试试这个应该解决它:)

DON在以下评论中引用的解释:

var jan; 这会将变量声明为未定义,所以当你尝试添加未定义的值时,你将获得NaN,所以这里的var jan = 0的答案将起作用 - DON

  • `var jan;`,这会将变量声明为`undefined`,所以当你尝试使用`undefined`添加值时,你会得到'NaN`,所以这里用`var jan = 0`的答案就可以了 (3认同)

mar*_*rds 6

我喜欢这种方法.当jan不存在时,它基本上在第一次迭代时将值设置为0.

jan = (jan || 0) + parseFloat(data[i].jan);
Run Code Online (Sandbox Code Playgroud)