Получить значения MIN и MAX из массива для функции JS?

0

Я хочу использовать значение MIN и MAX aht_value из моего json_encoded для использования в моей функции 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: Я хочу разместить здесь значение MIN и MAX 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);
Теги:
arrays

4 ответа

1
Лучший ответ

Вы можете использовать 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);
  • 0
    привет, как можно было бы получить значения MIN и MAX из вашего решения и заменить их значениями 100 и 1800 для моей функции "conv (x)", спасибо заранее
  • 0
    Я обновил свой код с помощью функций, которые вам будет проще использовать повторно. Вы захотите передать новые переменные в функцию с заполненными этими значениями. Смотрите эту скрипку для примера.
0

передать объект 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 
} 

ИЛИ вы можете сортировать и получать первый и последний объект с помощью ключа val

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

sortByAttribue(data, "aht_value")

Теперь получите первое значение ключа "aht_value" FROM первого объекта и последнего объекта

0

Поскольку вы уже итерируете результирующий набор в PHP, я бы предложил несколько вариантов. Вы можете либо отсортировать массив в PHP beofre return, чтобы значение min можно было вывести в js, посмотрев на arrayFromJson[0].aht_value и max by arrayFromJson[arrayFromJson.length - 1].aht_value. Или вы можете собрать значение min.max при итерации массива и отправить их в качестве дополнительных данных в JSON, чтобы вы могли выглядеть JSON

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

Конечно, вы всегда можете перебирать массив, полученный из JSON в javascript, чтобы определить значения min/max, но это похоже на ненужные накладные расходы, если вы просто делаете это на сервере.

0

Вы можете захватить min и max в одном и том же режиме, чтобы сохранить там некоторое время выполнения. Если такого рода вещи нужно делать совсем немного или в нескольких местах, возможно, лучше сделать это на бэкэнде, как предлагает Майк.

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)));
  • 0
    привет, как можно было бы получить значения MIN и MAX из вашего решения и заменить их значениями 100 и 1800 для моей функции "conv (x)", спасибо заранее
  • 0
    Если вы хотите заменить значения в исходном массиве, то вы хотите отслеживать индекс элементов min и max, а не обязательно значение. Если вы хотите использовать min и max вместо этих чисел (в вашем комментарии здесь не совсем понятно, что вы хотите), вы просто получите доступ к значениям .min и .max возвращаемым из вызова функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню