2016-03-22 13 views
3

birden dizilerinden aynı anahtarı olan değerlerin toplam ortalamasını alın:JavaScript/JSON aşağıdaki JSON (neredeyse her saniye) içeren arka ucundan gerçek zamanlı yanıtları alıyorum

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

başka dizi

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

bilerek hemen hemen her saniye yukarıdaki JSON alıyorum (bir saniye veya daha az sonra) o farklı değerler ve kimliği' ile geliyor her zaman s ve dizinin kendisi belirli bir boyuta sahip değildir.

Yapmak istediğim, aynı anahtar 'id' değerine sahip değerlerin ortalamasını almaktır.

Örneğin, yukarıda belirtilen dizi için, ortalama TPE20 olacak:

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

bunun (örneğin JQuery kullanarak) buradan göstermelidir [gerçek zamanlı gibi ortalama değeri düşünün

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

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

aşağıdaki döngü için ben yazdırmak JSON kullanarak yukarıda listelenen

Sorun şu ki (1/sn) bir kerede çok sayıda dizi alıyorum, her dizi farklı "id" ve "val" içeriyor, ben gerçekten nasıl bir yol kullanarak ortalama hesaplayabilirim bilmiyorum Yukarıda tarif edilen!

cevap

4

Sadece bir dizi nesnenin kimliklerini ve bu sayıların sayısını, toplamını ve ortalamasını içeren nesneleri gösteren değerleri içeren bir nesne kullanın.

yeni dizisi basitçe nesneyi güncellemek alırsınız:

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 konsolunda tamamlanmış nesne işlevine her ikincisi dizisi gönderme ve sonra görüntülendiği setInterval ile.

+1

Outstaaaanding da özelliklerini ortalamalar korumak için arka arkaya işlev için her bir nesnenin geçmesi !!!! Yardım için teşekkürler!!! –

0

Bu yardımcı olur mu? İstediğiniz gibi arama teriminin ortalamasını alırsınız. Bu dizi yineleme yapmak jquery $ .each kullanan

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

Sen, benzersiz özellik callback'inde içinde gerçekleşir vesilelerle mağaza sayısına bir nesneye özel mülkiyet oluşturmak Array.prototype.forEach() kullanabilirsiniz; tek bir nesne

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)

İlgili konular