我在获取JSON数组对象的最大值时获得NaN
和Infinity
。
我试图从其他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;
}
}
});
答案 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)
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.797693134862315E+308
的数字都是无穷大。使用isFinite()
进行检查。NaN
表示不是数字值,您可以使用isNaN()
或仅if()