对象在返回值时返回NaN

时间:2013-01-20 06:16:11

标签: 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
    }
]

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

var jan;

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

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

4 个答案:

答案 0 :(得分:9)

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);
    }
}

试试这个应该解决它:)

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

  

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

答案 1 :(得分:5)

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

jan = (jan || 0) + parseFloat(data[i].jan);

答案 2 :(得分:0)

您需要先初始化jan

var jan = 0; 

这是示例 - link

答案 3 :(得分:-1)

我是lodash sumBy函数的忠实粉丝:

var jan = _.sumBy(data, function(eachObj) { return eachObj.jan; });