我从后端收到包含以下JSON的实时响应(几乎每秒一次):
一个阵列:
{
"newUpdate": [
{
"id": "TP",
"val" : 3
},
{
"id": "TPE20",
"val" : 3
}]
}
另一个数组(一秒或更短时间后)
{
"newUpdate": [
{
"id": "CRK",
"val" : 24
},
{
"id": "TPE20",
"val" : 44
}]
}
我几乎每一秒都得到上面的JSON知道每次它带有不同的值和id,并且数组本身没有特定的大小。
嗯,我想要做的是让值的平均值具有相同的键' id'。
例如,对于上述数组,平均值为 TPE20 :
(3+44)/2 =23.2 (as it computes the average for the id : TPE20)
然后它应该在这里显示(例如使用JQuery)[想想股票市场中的实时平均值]
<div id="TPE20"></div>
目前,使用下面的for循环,我打印上面列出的JSON:
for(var i in load.updates){
var id = load.newUpdate[i].id;
updatesMap[id] = load.newUpdate[i].value;
var valueOfID = newUpdate[id];
}
挑战在于我一次接收大量数组(1 / sec),每个数组包含不同的&#34; id&#34;和&#34; val&#34;,我真的不知道如何使用我上面描述的方式计算平均值!
答案 0 :(得分:4)
只需使用一个对象,其中键表示数组对象的ID,值为对象,包含这些ID的计数,总数和平均值。
收到新数组后,只需更新对象:
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 setInterval
每秒向函数发送一个数组,然后在控制台中显示已完成的对象。
答案 1 :(得分:0)
这有帮助吗?它会像您要求的那样获得搜索字词的平均值。它使用jquery $ .each来遍历数组
function setMinHeight() {
$('#fullHeightDiv').css('min-height', window.innerHeight+'px');
}
$(document)
.ajaxComplete(function() {
// Call function after every ajax call on the page
setMinHeight();
})
.ready(function() {
// Call function after every resize event.
$(window).resize(setMinHeight);
// Call function once DOM is ready.
setMinHeight();
});
&#13;
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"))
&#13;
答案 2 :(得分:0)
您可以使用Array.prototype.forEach()
,在对象上创建私有属性,以存储回调内发生的唯一属性的次数;单独传递每个对象以连续运行以维持单个对象的属性平均值
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)