没有从JSON数组获取正确的值

时间:2015-07-12 03:58:54

标签: javascript jquery json

我在获取JSON数组对象的最大值时获得NaNInfinity

我试图从其他JSON追加GeoJSOn数据的属性。 这是JSFiddle供参考。

摘录:

$.map(data, function (e) {
    var dev_id = e.dev_id;
    var data = e.data;
    for (var j = 0; j < data.length; j++) {
        var rainVal = parseFloat(data[j].rain_value);
        arr[j] = parseFloat(rainVal);
    }
    var max = Math.max.apply(Math, arr) * 4;
    console.log(dev_id + " " + max)
    for (var k = 0; k < len; k++) {
        jsonObj_device_id = jsonObj.features[k].properties["device_id"];
        if (jsonObj_device_id === dev_id) {
            var nameR = "rain_intensity";
            var rainValue = max;
            jsonObj.features[k].properties[nameR] = rainValue;
        }
    }
});

2 个答案:

答案 0 :(得分:1)

您的代码中存在一些情况,即在AJAX响应中,您要么未获得数据,e.data,要么获得未获得的数据rain_value。如果您第一次没有获得e.data,则会在控制台上登录Infinity,因为var max = Math.max.apply(Math, [])会导致-Infinity。如果您没有得到rain_value,那么parseFloat会给您NaN

在此类操作之前验证API响应。这样的事情。

    var dev_id = e.dev_id;
    var data = e.data;
    var max = 0, r;
    var arr = [];
    if(data) {
        for (var j = 0; j < data.length; j++) {
            r = data[j].rain_value || 0;
            arr[j] = parseFloat(r);
        }
    }
    if(arr.length) {
        max = Math.max.apply(Math, arr) * 4;
    }

    console.log(dev_id + " " + max);

答案 1 :(得分:0)

这是working demo

var rainVal = parseFloat(data[j].rain_value);
if (!rainVal) // check 1
    rainVal = 0;
arr[j] = parseFloat(rainVal);
}
var max = 0;
if (arr) // check 2
{
    maxBeforeTested = Math.max.apply(Math, arr) * 4;
    if (isFinite(maxBeforeTested)) //check 3
        max = maxBeforeTested;
    else 
        console.log("Had an infinite value here.");
}
console.log("Cleaned output: " + dev_id + " " + max)

基本上,您需要进行一些检查,我已将评论添加为“检查”。

  1. 任何大于1.797693134862315E+308的数字都是无穷大。使用isFinite()进行检查。
  2. NaN表示不是数字值,您可以使用isNaN()或仅if()
  3. 进行检查