Получить строку объекта по значению

У меня есть объект:

{
    "status": 200,
    "error": false,
    "msg": "Successful response",
    "data": {
        "horodate": [ "2016-10-13 00:00:00", "2016-10-13 00:30:00", ... ], 
        "value": [ 2609.479, 2390.026, 2320.394, 2276.602, 2247.151, ... ]
    }
}

Я получаю максимальное и минимальное значение:

$.getJSON(url, function (data) {
    // ...
    var arr = Object.keys(data['data']['value']).map(function(key) { 
        return data['data']['value'][key]; 
    });
    var min = Math.min.apply(null, arr);
    var max = Math.max.apply(null, arr);
    console.log(min); //2609.479
    console.log(max); //2247.151

Но как я могу получить horodateэти минимальные и максимальные значения, когда я извлекаю min и max из объекта?

jquery,

0

Ответов: 3


1 принят

Вы можете получить индекс min, а затем получить horodateсоответствующий этому индексу:

data = {
  "status": 200,
  "error": false,
  "msg": "Successful response",
  "data": {
    "horodate": [ "2016-10-13 00:00:00", "2016-10-13 00:30:00", "2016-10-13 01:00:00", "2016-10-13 01:30:00", "2016-10-13 02:00:00"], 
    "value": [ 2609.479, 2390.026, 2320.394, 2276.602, 2247.151]
  }
}
var values_arr = data['data']['value']  
var horodates_arr = data['data']['horodate']  

var date_for_value = function(value){
  var min_index = values_arr.indexOf(value);
  return horodates_arr[min_index];  
}

var min = {'value': Math.min.apply(null, values_arr),
           'horodate': date_for_value(min['value'])}

var max = {'value': Math.max.apply(null, values_arr),
           'horodate': date_for_value(max['value'])}

console.log(min); //Object { value=2247.151,  horodate="2016-10-13 02:00:00"}
console.log(max); //Object { value=2609.479,  horodate="2016-10-13 00:00:00"}

3

Проблема заключается в том, что вы отключите min / max от данных. Таким образом, либо вам нужен другой способ получить минимальный максимум, либо вам нужно выполнить цикл по набору и сопоставить min / max. Я бы сделал это по-другому.

Я бы перебирал набор и делал чек справа и там, чтобы искать мин и макс. Таким образом, вы делаете один цикл.

var result = {
  "status": 200,
  "error": false,
  "msg": "Successful response",
  "data": {
    "horodate": ["2016-10-13 00:00:00", "2016-10-13 00:30:00", "x", "y", "z"],
    "value": [2609.479, 2390.026, 2320.394, 2276.602, 2247.151]
  }
}

function getMinMax(data) {
   var details = {  //store first index for min and max
       minV : data.value[0],
       maxV : data.value[0],
       minH : data.horodate[0],
       maxH : data.horodate[0]
     };
   return data.value.reduce( function (d, val, ind ){  //I used reduce, you can use a for loop or forEach
     if (d.minV > val) {  //see if we have a min
       d.minV = val;
       d.minH = data.horodate[ind];
     }
     else if (d.maxV < val) {  //see if we have a max
       d.maxV = val;
       d.maxH = data.horodate[ind];
     }
     
     return d;
   }, details );
  
  
}

var results = getMinMax(result.data);
console.log(results);

Поскольку OP думает, что он сложный, собирается сделать его просто циклом for вместо сокращения.

var result = {
  "status": 200,
  "error": false,
  "msg": "Successful response",
  "data": {
    "horodate": ["2016-10-13 00:00:00", "2016-10-13 00:30:00", "x", "y", "z"],
    "value": [2609.479, 2390.026, 2320.394, 2276.602, 2247.151]
  }
}

function getMinMax(data) {
  var details = { //store first index for min and max
    minV: data.value[0],
    maxV: data.value[0],
    minH: data.horodate[0],
    maxH: data.horodate[0]
  };

  //loop over the values
  for (var ind = 0; ind < data.value.length; ind++) {
    var val = data.value[ind];
    if (details.minV > val) { //see if we have a min
      details.minV = val;
      details.minH = data.horodate[ind];
    } else if (details.maxV < val) { //see if we have a max
      details.maxV = val;
      details.maxH = data.horodate[ind];
    }
  }
  //return the results
  return details;
}

var results = getMinMax(result.data);
console.log(results);


0
$(function() {
    var result = {
        status: 200,
        error: false,
        msg: "Successful response",
        data: {
            "horodate": ["2016-10-13 00:00:00", "2016-10-13 00:30:00", "x", "y", "z"],
            "value": [2609.479, 2390.026, 2320.394, 2276.602, 2247.151]
        }
    }

    var highest = 0; // for the highest value
    var lowest = Number.MAX_VALUE; // for the lowest value
    var lowIndex = 0; // for the lowest date
    var highndex = 0; // for the highest date
    var obj = {}; // object that hold all the info

    $(result.data.value)
        .each(function(i, v) {

            if (v > highest) {
                highest = v;
                highndex = i
            }

            if (v < lowest) {
                lowest = v;
                lowIndex = i
            }
           // if it is the last item in the array then set values
            if ((i + 1) == result.data.value.length) { 
                obj.highest = highest;
                obj.lowest = lowest;
                obj.dateHigh = result.data.horodate[highndex]
                obj.dateLow = result.data.horodate[lowIndex]
            }


        })
    console.log(obj);
});

играть на скрипке

JQuery,
Похожие вопросы