2016-10-13 7 views
0

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

{ 
    "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 из объекта?

+0

Возможный дубликат [Min/Max дат в массиве?] (http://stackoverflow.com/questions/7143399/min-max-of-dates-in-a-array) – Weedoze

+1

@Weedoze не то, что ОП задает – epascarello

+0

Вы можете проанализировать данные с помощью parseJSON(), а затем получить доступ к элементу. – AshishJindal

ответ

1

Вы можете получить индекс мин, а затем получить 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"} 
+0

большое вам спасибо! – user2203384

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 думает, что это сложный, собирается сделать это просто цикл вместо уменьшения.

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

Thansk you! он работает, но ответ mohamed-ibrahim легче понять для меня. Я дал вам +1 – user2203384

+0

Это всего лишь петля, а не несколько поисковых запросов. Другой ответ требует гораздо большей обработки. Все, что делает сокращение, это цикл, он может просто быть циклом for. – epascarello

+0

Я добавил цикл for, чтобы вы могли видеть, что делает сокращение. В конце концов, ответ должен сработать. Мой ответ делает все в одном цикле, другой ответ требует нескольких циклов (один цикл для получения min, один цикл для получения max, один для нахождения значения с indexOf, а другой - для определения значения с помощью indexOf) – epascarello

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); 
}); 

fiddle

Смежные вопросы