2016-10-13 14 views
0

Ich habe ein Objekt:Get Objekt Reihe von Wert

{ 
    "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, ... ] 
    } 
} 

ich die Maximal- und Minimalwert bekommen:

$.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 

Aber wie kann ich die horodate dieser Min- und Max-Werte erhalten wenn ich min und max vom Objekt abrufe?

+0

Mögliche Duplikat [Min/Max von Daten in einem Array?] (http://stackoverflow.com/questions/7143399/min-max-von-Daten-in-einem-Array) – Weedoze

+1

@Weedoze nicht, was OP fragt – epascarello

+0

Sie können die Daten mit parseJSON() analysieren und dann auf das Element zugreifen. – AshishJindal

Antwort

1

Sie können die min-Index und dann die horodate diesem Index entsprechenden erhalten:

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

vielen dank! – user2203384

3

Das Problem ist, dass Sie die Min/Max von den Daten trennen. Entweder benötigen Sie einen anderen Weg, um die Min Max zu erhalten, oder Sie müssen über den Satz schleifen und die Min/Max-Werte anpassen. Ich würde es anders machen.

Ich würde über das Set Schleife und die Überprüfung rechts als und dort nach dem min und max zu suchen. Auf diese Weise machen Sie eine Schleife.

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

Da OP denkt, dass es komplex ist, ist es nur ein for-Schleife machen gehen, anstatt zu reduzieren.

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! es funktioniert auch, aber mohamed-ibrahims antwort ist für mich leichter zu verstehen. Ich gab Ihnen +1 – user2203384

+0

Es ist nur eine Schleife und nicht mehrere Lookups. Die andere Antwort erfordert viel mehr Verarbeitung. Alles Reduzieren ist eine Schleife, es kann einfach eine For-Schleife sein. – epascarello

+0

Ich habe eine for-Schleife hinzugefügt, damit Sie sehen können, was reduce macht. Am Ende sollte jede Antwort funktionieren. Meine Antwort macht alles in einer Schleife, die andere Antwort erfordert mehrere Schleifen (eine Schleife um min zu bekommen, eine Schleife um max zu erhalten, eine um den Wert mit indexOf zu finden und eine andere um den Wert mit indexOf zu finden) – 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