2016-03-22 4 views
3

複数のアレイから同じキーを持つ値の合計平均を取得します。のJavaScript/JSON私は、次のJSON(ほとんど毎秒)を含んでバックエンドからのリアルタイムの応答を受け付けております

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

(1秒以下の後に)別の配列は、

{ 
"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 /秒)、各配列には異なる "id"と "val"が含まれています。実際の方法で平均をどのように計算できるかわかりません上記の!

答えて

4

これらのIDの数、合計、および平均を含むオブジェクトとして、配列オブジェクトのIDを表すキーを持つオブジェクトを使用してください。

あなたは、単にオブジェクトの更新新しい配列受け取る:setIntervalは、各第二の機能を1列を送信した後、コンソールに完成したオブジェクトを表示して

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を。

+1

Outstaaaandingで特性の平均値を維持するために連続的に機能する個別オブジェクトを渡す!!!!お手伝いありがとう!!! –

0

これは役に立ちますか?あなたのように検索タームの平均を求めます。これは、アレイ

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

あなたはユニークなプロパティは、コールバック内で発生する機会の店舗番号へのオブジェクトのプライベートプロパティを作成し、Array.prototype.forEach()を使用することができますを反復処理するためにjqueryの$ .eachを使用しています。単一のオブジェクト

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)

関連する問題