在JS数组中测试NaN

Testing for NaN in a JS array?

本文关键字:测试 NaN 数组 JS      更新时间:2023-09-26

昨天我发布了一个关于获取高点的问题。JS来处理XML数据被推送到它时的问题。我没有深入研究,所以我认为我得到的答案有点离谱,所以我今天要试着重新发布它,看看我是否能得到更适合我的问题的答案

我有一个Quickbase应用程序,它正在使用API调用中的XML数据绘制为highchart.js图。XML数据是一个表查询,从14个字段中带回记录数据。在这些字段中,数据的范围可以从.001到99.99,但其中一些字段会不时为空,从而生成{NaN,NaN,NaN}的数组。当该序列被推入图中时,它会使整个图为空,直到您取消选择选项

昨天有人建议Highcharts有一个内置的"nodata"功能,然而,我能找到解释的唯一方法是,当有一个例子表明绝对没有数据提供给图时(在这种情况下,它在图上显示为"没有数据",但这不是我想要的,因为总是会有至少一个(通常至少五个,但为了简单起见,我会说一个)字段有数据。

这是我目前使用的代码

    <!DOCTYPE html>
<html>
<head>
<title>Graph</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/no-data-to-display.js"></script>
<script>
$(document).ready(function() {
    var sgaxml = 'https://sga.quickbase.com/db/bjmdensiu?apptoken=beadyrucxguavbx5isubd6iaqpe&act=API_DoQuery&query=%7B14.EX.%27_FID_9%7D&clist=7.24.25.26.27.28.29.30.31.32.33.34.35.36.37'
        var options = {
            chart: {
                renderTo: 'container',
                type: 'column'
            },
            title: {
                text: 'Components Over Time'
            },
            xAxis: {
                categories: []
            },
            yAxis: {
                title: {
                    text: 'Concentration%'
                }
            },
            series: []
        };
        // Load the data from the XML file 
        $.get(sgaxml, function(xml) {
        // Split the lines
        var xml = $(xml).find('record');

    // Variables for the component series
    var seriesH = {
            name: 'Hydrogen',
            data: []
        };
         var seriesHe = {
            name: 'Helium',
            data: []
        };
    var seriesO = {
            name: 'Oxygen',
            data: []
        };
    var seriesHs = {
            name: 'Hydrogen Sulfide',
            data: []
        };
    var seriesN = {
            name: 'Nitrogen',
            data: []
        };
    var seriesC = {
            name: 'Carbon Dioxide',
            data: []
        };
    var seriesM = {
            name: 'Methane',
            data: []
        };
    var seriesE = {
            name: 'Ethane',
            data: []
        };
    var seriesP = {
            name: 'Propane',
            data: []
        };
    var seriesIb = {
            name: 'Iso-Butane',
            data: []
        };
    var seriesNb = {
            name: 'N-Butane',
            data: []
        };
    var seriesIp = {
            name: 'Iso-Pentane',
            data: []
        };
    var seriesNp = {
            name: 'N-Pentane',
            data: []
        };
    var seriesHex = {
            name: 'Hexanes+',
            data: []
        };
    xml.each(function (i, record) {
            options.xAxis.categories.push(new Date(parseInt($(record).find('sample_date').text())));
        seriesH.data.push(parseFloat($(record).find('hydrogen').text()));
        seriesHe.data.push(parseFloat($(record).find('helium').text()));
        seriesO.data.push(parseFloat($(record).find('oxygen').text()));
        seriesHs.data.push(parseFloat($(record).find('hydrogen_sulfide').text()));
        seriesN.data.push(parseFloat($(record).find('nitrogen').text()));
        seriesC.data.push(parseFloat($(record).find('co2').text()));
            seriesM.data.push(parseFloat($(record).find('methane').text()));
            seriesE.data.push(parseFloat($(record).find('ethane').text()));
        seriesP.data.push(parseFloat($(record).find('propane').text()));
        seriesIb.data.push(parseFloat($(record).find('iso_butane').text()));
        seriesNb.data.push(parseFloat($(record).find('n_butane').text()));
        seriesIp.data.push(parseFloat($(record).find('iso_pentane').text()));
        seriesNp.data.push(parseFloat($(record).find('n_pentane').text()));
        seriesHex.data.push(parseFloat($(record).find('hexanes_').text()));
        });
    console.log(seriesO.data);  
        if(seriesH.data >= .001){console.log("No Hydrogen Data")} else {options.series.push(seriesH)};
    if(seriesHe.data >= .001){console.log("No Helium Data")} else {options.series.push(seriesHe)};
    if(seriesO.data >= .001){console.log("No Oxygen Data")} else {options.series.push(seriesO)};
    if(seriesHs.data >= .001){console.log("No H2S Data")} else {options.series.push(seriesHs)};
    if(seriesN.data >= .001){console.log("No Nitrogen Data")} else {options.series.push(seriesN)};
    if(seriesC.data >= .001){console.log("No Carbon Dioxide Data")} else {options.series.push(seriesC)};
    if(seriesM.data >= .001){console.log("No Methane Data")} else {options.series.push(seriesM)};
    if(seriesE.data >= .001){console.log("No Ethane Data")} else {options.series.push(seriesE)};
    if(seriesP.data >= .001){console.log("No Propane Data")} else {options.series.push(seriesP)};
    if(seriesIb.data >= .001){console.log("No Iso-B Data")} else {options.series.push(seriesIb)};
    if(seriesNb.data >= .001){console.log("No N-B Data")} else {options.series.push(seriesNb)};
    if(seriesIp.data >= .001){console.log("No Iso-P Data")} else {options.series.push(seriesIp)};
    if(seriesNp.data >=.001){console.log("No N-P Data")} else {options.series.push(seriesNp)};
    if(seriesHex.data >=.001){console.log("No Hexane+ Data")} else {options.series.push(seriesHex)};
        console.log('options: ', options);
            var chart = new Highcharts.Chart(options);
    });
});
</script>
</head>
<body>
<div id="container" style=" width: 1000px; height: 600px; margin: 0 auto "></div>
</body>
</html>

这是API调用的XML输出

    <qdbapi>
<action>API_DoQuery</action>
<errcode>0</errcode>
<errtext>No error</errtext>
<dbinfo>
<name>RESULT</name>
<desc/>
</dbinfo>
<variables>
<co2>Carbon Dioxide</co2>
<methane>methane</methane>
</variables>
<chdbids></chdbids>
<record>
<sample_date>1386892800000</sample_date>
<hydrogen>0.002</hydrogen>
<helium>0.114</helium>
<oxygen/>
<hydrogen_sulfide/>
<nitrogen>1.926</nitrogen>
<co2>0.454</co2>
<methane>82.163</methane>
<ethane>6.353</ethane>
<propane>4.760</propane>
<iso_butane>0.618</iso_butane>
<n_butane>1.819</n_butane>
<iso_pentane>0.491</iso_pentane>
<n_pentane>0.544</n_pentane>
<hexanes_>0.756</hexanes_>
<update_id>1408654196361</update_id>
</record>
<record>
<sample_date>1383782400000</sample_date>
<hydrogen>0.006</hydrogen>
<helium>0.038</helium>
<oxygen/>
<hydrogen_sulfide/>
<nitrogen>0.512</nitrogen>
<co2>0.844</co2>
<methane>83.178</methane>
<ethane>8.678</ethane>
<propane>3.631</propane>
<iso_butane>0.493</iso_butane>
<n_butane>1.097</n_butane>
<iso_pentane>0.342</iso_pentane>
<n_pentane>0.371</n_pentane>
<hexanes_>0.810</hexanes_>
<update_id>1408981434690</update_id>
</record>
<record>
<sample_date>1369699200000</sample_date>
<hydrogen>0.004</hydrogen>
<helium>0.060</helium>
<oxygen/>
<hydrogen_sulfide/>
<nitrogen>1.684</nitrogen>
<co2>0.443</co2>
<methane>77.742</methane>
<ethane>10.430</ethane>
<propane>6.842</propane>
<iso_butane>0.587</iso_butane>
<n_butane>1.482</n_butane>
<iso_pentane>0.232</iso_pentane>
<n_pentane>0.249</n_pentane>
<hexanes_>0.245</hexanes_>
<update_id>1408981112624</update_id>
</record>
</qdbapi>

我知道在我代码的最后半部分,if-else不起作用,因为数组中的值不是数字,而是NaN。我的问题是,如果我有NaN值,我将如何进行测试,如果我这样做了,不要将该序列推到图中。我不能完全删掉它,因为有些人实际上会有当前在NaN 上获得值的值

查看xml,这些值是有效的数字,因此不能是NaN。我在代码中发现的一个逻辑错误是,您正在将数组seriesH.data与无效的数字.001进行比较。

 if(seriesH.data >= .001){console.log("No Hydrogen Data")} else {options.series.push(seriesH)};

您应该将数组的单个元素与数值测试进行比较。

 if(seriesH.data[0] >= .001){console.log("No Hydrogen Data")} else {options.series.push(seriesH)};