2016-03-22 9 views
3

ich Echtzeit-Antworten von der Back-End-empfange, der die folgende JSON enthält (fast jede Sekunde):JavaScript/JSON - die durchschnittliche Werte Holen Sie den gleichen Schlüssel aus mehreren Arrays mit

Ein Array:

{ 
"newUpdate": [ 
{ 
    "id": "TP", 
    "val" : 3 
}, 
{ 
    "id": "TPE20", 
    "val" : 3 
}] 
} 

Eine weitere Anordnung (nach einer Sekunde oder weniger)

{ 
"newUpdate": [ 
{ 
    "id": "CRK", 
    "val" : 24 
}, 
{ 
    "id": "TPE20", 
    "val" : 44 
}] 
} 

ich bin die oben JSON bekommen fast jede Sekunde zu wissen, dass jedes Mal mit unterschiedlichen Werten und id kommt‘ s, und das Array selbst hat keine bestimmte Größe.

Nun, was ich tun möchte, ist es, den Durchschnitt der Werte mit dem gleichen Schlüssel 'ID' zu bekommen.

Zum Beispiel für die obige Anordnung, der Durchschnitt für TPE20 sein wird:

(3+44)/2 =23.2 (as it computes the average for the id : TPE20) 

Dann sollte es hier zeigen (JQuery mit zum Beispiel) [Denken Sie an die Echtzeit-Durchschnittswert wie in den Aktienmarkt]

<div id="TPE20"></div> 

Derzeit die unten for-Schleife, ich drucke die JSON oben aufgeführt:

for(var i in load.updates){ 
var id =  load.newUpdate[i].id; 
updatesMap[id] = load.newUpdate[i].value; 
var valueOfID = newUpdate[id]; 
} 

Die Herausforderung besteht darin, dass ich viele Arrays auf einmal empfange (1/sec), jedes Array enthält unterschiedliche "id" und "val", ich weiß wirklich nicht, wie ich den Durchschnitt berechnen kann oben beschrieben!

Antwort

4

Verwenden Sie einfach ein Objekt mit Schlüsseln, die die IDs der Array-Objekte darstellen, und die Werte als Objekte, die die Anzahl, die Summe und den Durchschnitt dieser IDs enthalten.

Wenn Sie ein neues Array einfach erhalten, das Objekt aktualisieren:

function updateObj(arr) { 
    arr.forEach(function(el) { 
    var key = el.id; 
    obj[key] = obj[key] || { count: 0, total: 0, avg: 0 }; 
    obj[key].count++; 
    obj[key].total += el.val; 
    obj[key].avg = obj[key].total/obj[key].count; 
    }); 
} 

Here's a simulation mit setInterval ein Array an die Funktion in jede Sekunde zu senden, und dann in der Konsole das fertige Objekt angezeigt wird.

+1

Outstaaaanding aufrechtzuerhalten !!!! Danke für die Hilfe!!! –

0

Hilft das? Es erhält den Durchschnitt des Suchbegriffs wie Sie gefragt haben. Es nutzt jQuery $ .each durch das Array kann

var newdata = [ 
 
    { 
 
    "newUpdate": [ 
 
     { 
 
     "id": "TP", 
 
     "val" : 3 
 
     }, 
 
     { 
 
     "id": "TPE20", 
 
     "val" : 3 
 
     }] 
 
    }, 
 
    { 
 
    "newUpdate": [ 
 
     { 
 
     "id": "CRK", 
 
     "val" : 24 
 
     }, 
 
     { 
 
     "id": "TPE20", 
 
     "val" : 44 
 
     }] 
 
    } 
 
] 
 

 
function getAverage(array, term){ 
 
    var sum = 0, n = 0; 
 
    $.each(array, function(i, item){ 
 
    n++ 
 
    var arrs = item.newUpdate 
 
    $.each(arrs, function(d, place){ 
 
     // console.log(d) 
 
     if (place.id == term){ 
 
     sum +=place.val 
 
     } 
 

 

 
    }) 
 

 
    }) 
 
    return sum/n 
 
} 
 

 
document.write(getAverage(newdata, "TPE20"))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

0

Sie Array.prototype.forEach() verwenden iterieren, ein Privateigentum an einem Objekt zu speichern Anzahl von Gelegenheiten einzigartige Eigenschaft tritt innerhalb Rückruf erstellen; passieren jedes Objekt einzeln nacheinander funktionieren Mittelwerte von Eigenschaften bei einzelnen Objekt

var a = { 
 
    "newUpdate": [{ 
 
    "id": "TP", 
 
    "val": 3 
 
    }, { 
 
    "id": "TPE20", 
 
    "val": 3 
 
    }] 
 
}; 
 

 
var b = { 
 
    "newUpdate": [{ 
 
    "id": "CRK", 
 
    "val": 24 
 
    }, { 
 
    "id": "TPE20", 
 
    "val": 44 
 
    }] 
 
} 
 

 
var avg = {}; 
 

 
function update(update) { 
 

 
    update.newUpdate.forEach(function(value, index) { 
 
    if (!avg[value.id] || !avg.hasOwnProperty(value.id)) { 
 
     avg["_" + value.id] = 1; 
 
     avg[value.id] = value.val/avg["_" + value.id]; 
 
    } else { 
 
     ++avg["_" + value.id]; 
 
     avg[value.id] += value.val; 
 
     avg[value.id] = avg[value.id]/avg["_" + value.id]; 
 
    } 
 

 
    }); 
 
    
 
    return avg 
 
    
 
} 
 

 
console.log(update(a), update(b), avg)

Verwandte Themen