2017-09-06 94 views
0

无法获得阵列减少工作:阵列减少和空值

var labels = ["MetricLinuxMemory","memCached","memTotalFree","MetricLinuxCPU","CpuRawSystem","memTotalSwap"]; 
var columns = [{values:[12,1,2,23,null,2]},{values:[12,null,2]},{values:[12,1,2]},{values:[12,1,2]},{values:[12,1,2]},{values:[12,1,2]}]; 

var data = {};  //Selected Performance data 

// Loop through labels 
for (var i = 0; i < labels.length; i++) { 

    var label = labels[i]; 

    //Search for calculated vlaue (Metric) 
    if(label.includes("Metric")){ 

     //Create property in data object 
     data[label] = {}; 

     var metric = data[label]; 
      metric.samples = []; 
      metric.sum = 1; 

     //Get appropriate column 
     var values = columns[i].values; 

     // Loop through values 
     for (var ii = 0; ii < values.length; ii++) {  

      //Convert to numeric 
      var value = parseInt(values[ii], 10); 

      //Push to data 
      metric.samples.push(value); 
      metric.sum = metric.samples.reduce(function(a, b) { return a + b; }, 0); 

     } 


    } 
} 

所需的输出将是:

{ 
    "MetricLinuxMemory": { 
     "samples": [ 
      ... 
      23, 
      null, 
      ... 
     ], 
     "sum": 40 
    }, 
    ... 
} 

但是我似乎无法得到一个总和的工作。而是在MetricLinuxMemory中取得空值。不应该parseInt照顾null输入并将其转换为0?

回答

0

parseInt函数仍然会返回NaN的,不是0只需使用:

var value = values[ii] == null? 0 : parseInt(values[ii], 10); 
1

不宜parseInt函数取零输入的照顾,并将其转换例如为0?

恰恰相反。 parseIntnull转换为NaN(将其转换为字符串"null"后)。除了字符串之外,您不应该使用parseInt

如果你刚刚离开它,它甚至可以工作,因为与null相加的数字会导致它被强制为0。但是,如果您想明确说明,只需将samples.push(value)声明放入if (value != null)if (typeof value == "number")声明中即可。