J'obtiens NaN et Infinity pour obtenir la valeur maximale de mon objet JSON Array.

J'essaie d'ajouter les propriétés d'une donnée GeoJSOn à partir d'un autre JSON. Voici le JSFiddle pour référence.

L'extrait:

$.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
Sachi Tekina 12 juil. 2015 à 06:58

2 réponses

Meilleure réponse

Il y a des cas dans votre code, où dans la réponse AJAX, vous n'obtenez pas les données, c'est-à-dire e.data ou si vous obtenez les données que vous n'obtenez pas rain_value. Si vous n'obtenez pas e.data la première fois, vous serez connecté à Infinity sur votre console, car var max = Math.max.apply(Math, []) entraîne -Infinity. Si vous n'obtenez pas rain_value alors parseFloat vous donnera NaN.

Validez la réponse de l'API avant de telles opérations. Quelque chose comme ça.

    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
Rahul Nanwani 12 juil. 2015 à 04:45

Voici une démo fonctionnelle

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)

En gros, vous aviez besoin de quelques vérifications, j'ai ajouté des commentaires comme "Vérifier".

  1. Tout nombre supérieur à 1.797693134862315E+308 est l'infini. Utilisez isFinite() pour vérifier.
  2. NaN ne signifie pas une valeur numérique, vous pouvez le vérifier en utilisant isNaN() ou simplement if()
0
Sachin Nambiar Nalavattanon 12 juil. 2015 à 05:03