从数组中获取 JS 函数的最小值和最大值


Fetch MIN and MAX value from array for JS function?

我想使用json_encoded中的 MIN 和 MAX aht_value值在我的 JavaScript 函数中使用?这如何实现?

提前谢谢。

数组:

[{
   "username":"OXGOR",
   "aht_value":"241",
   "station":"B20"
  }
  {
   "username":"AISAI2",
    "aht_value":"199",
   "station":"B21"
  },
  {
   "username":"CAPAP3",
   "aht_value":"NA",
   "station":"B10"
  }]

map.php - JS,最后所有内容都将输出

<script type="text/javascript">
$(document).ready(function() {
                $('#aht').click(function(){
                    $.ajax({
                    type:"GET",
                    url : "show_aht.php",
                    data:{  } , // do I need to pass data if im GET ting?
                    dataType: 'json',
                    success : function(data){
                        //going through all DIVs only once with this loop
                            for(var i = 0; i < data.length; i++) { // loop over results
                            var divForResult = $('#desk_' + data[i]['station']); // look for div for this object
                            if(divForResult.length) { // if a div was found
                                divForResult.html(data[i]['aht_value']).css("background-color", colorMe(data[i]['aht_value']));
                            }//end if
                            }//end for
                    }//end success
                });//end ajax   
              });//end click
            });//end rdy

map.php - JS:我想把最小值和最大值aht_value放在这里,而不是 100 和 1800,但不起作用

    //get MIN value from the array
    var min = Math.min.apply(null, a.map(function(x) {
        var n = parseFloat(x.aht_value);
        return isNaN(n) ? 9007199254740992 : n;
    }));
    //get MAX value from the array              
    var max = Math.max.apply(null, a.map(function(x) {
        var n = parseFloat(x.aht_value);
        return isNaN(n) ? 0 : n;
    }));
    //function for calculation of background color depending on aht_value               
    function conv(x){
        return Math.floor((x - 100) / (1800 - 100) * 255);
    }
    //function for background color
    function colorMe(v){
        return "rgb(" + conv(v) + "," + (255-conv(v)) + ",0)";
    }
</script>

show.php : 我在哪里使用json_encode

$result = array();
    foreach ($memo as $username => $memodata) {
    if (in_array($username, array_keys($user))) {
    // Match username against the keys of $user (the usernames) 
    $userdata = $user[$username];
    //if AHT is null give N/A as value
    if (is_null($memodata['aht_value'])) {
        $result[] = array( 'username'  => $userdata['username'],
                                             'aht_value' => 'NA',
                                             'station'  => $userdata['station']
                                            );
    }//end inner if 
    //else give the actual value of AHT without the decimals
    else {
        $result[] = array( 'username'  => $userdata['username'],
                           'aht_value' => substr($memodata['aht_value'],0,-3),
                           'station'   => $userdata['station']
                                            );
echo json_encode($result);

您可以将 array.map() 与 array.apply() 结合使用,以创建简单的代码来计算对象数组中的最小值和最大值。在您的情况下,这稍微困难一些,因为您有需要过滤掉的非数字值。

var a = [ 
  {
   "username":"OXGOR",
   "aht_value":"241",
   "station":"B20"
  },
  {
   "username":"AISAI2",
    "aht_value":"199",
   "station":"B21"
  },
  {
   "username":"CAPAP3",
   "aht_value":"NA",
   "station":"B10"
  }
];
function minAHT(objArray) {
  return Math.min.apply(null, objArray.map(function(x) {
    var n = parseFloat(x.aht_value);
    return isNaN(n) ? 9007199254740992 : n;
  }));
}
  
function maxAHT(objArray) {
  return Math.max.apply(null, objArray.map(function(x) {
    var n = parseFloat(x.aht_value);
    return isNaN(n) ? 0 : n;
  }));
}
var min = minAHT(a);
var max = maxAHT(a);
alert("min: " + min + " max: " + max);

由于您已经在 PHP 中迭代结果集,因此我建议几个选项。 您可以在 PHP beofre 返回中对数组进行排序,这样可以通过查看 arrayFromJson[0].aht_value 在 js 中导出最小值,并通过 arrayFromJson[arrayFromJson.length - 1].aht_value 得出最大值。 或者,您可以在迭代数组时收集 min.max 值,并将它们作为 JSON 中的附加数据发送,这样 JSON 可能如下所示

{
   aht_min: XXX,
   aht_max: XXX,
   records: [
       {
           "username":"OXGOR",
           "aht_value":"241",
           "station":"B20"
       },
       ...
   ]
}

当然,您始终可以在 javascript 中遍历从 JSON 派生的数组来确定最小/最大值,但如果您只是在服务器上执行此操作,这似乎是不必要的开销。

您可以在同一时间捕获最小值和最大值,以节省一些执行时间。如果这种事情需要做很多事情或在多个地方完成,那么最好像 Mike 建议的那样在后端进行。

var data = [ 
  {
    "username":"OXGOR",
    "aht_value":"241",
    "station":"B20"
  },
  {
    "username":"AISAI2",
    "aht_value":"199",
    "station":"B21"
  },
  {
    "username":"CAPAP3",
    "aht_value":"NA",
    "station":"B10"
  }
];
var minMax = function(dataSet) {
  var min = null, max = null, i, len;
  for (i = 0, len = dataSet.length; i < len; ++i) {
    var data = dataSet[i], value = parseInt(data.aht_value);
    if (isNaN(value)) {
      continue;
    }
    if (min == null || value < min) {
      min = value;
    }
    if (max == null || value > max) {
      max = value;
    }
  }
  return {min: min, max: max};
};
alert(JSON.stringify(minMax(data)));

将 json 对象传递给 maxVal 和 minVal 函数。在成功函数中,您可以将数据用作:

function maxVal(data) {  
  var max, k; // don't set max=0, because keys may have values < 0  
  //go through single key
  for (var key in data) { if (data.hasOwnProperty(key)) { max = parseInt(data[key]); break; }} 
  //go through all keys
  for (var key in data) { if (data.hasOwnProperty(key)) { if((k = parseInt(data[key])) > max) max = k; }}  
var min, m; // don't set max=0, because keys may have values < 0  
  //go through single key
  for (var key in data) { if (data.hasOwnProperty(key)) { min = parseInt(data[key]); break; }} 
  //go through all keys
  for (var key in data) { if (data.hasOwnProperty(key)) { if((m = parseInt(data[key])) < min) min = m; }}  
//finally both max and min has maximum and minimum value 
} 

或者您可以按键值排序并获取第一个和最后一个对象

function sortByAttribue(d, attribute) {
  return d.sort(function(a,b) { 
    return a[attribute] < b[attribute];
  });
}
sortByAttribue(data, "aht_value")

现在从第一个对象和最后一个对象获取键"aht_value"的第一个值