【问题标题】:JavaScript/JSON - Get the total average of values having the same key from multiple arraysJavaScript/JSON - 从多个数组中获取具有相同键的值的总平均值
【发布时间】:2016-03-22 23:50:29
【问题描述】:

我正在接收来自后端的实时响应,其中包含以下 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/秒),每个数组包含不同的“id”和“val”,我真的不知道如何使用我的方式计算平均值如上所述!

【问题讨论】:

    标签: javascript jquery arrays json


    【解决方案1】:

    只需使用一个对象,其键表示数组对象的 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 simulationsetInterval 每秒向函数发送一个数组,然后在控制台中显示完成的对象。

    【讨论】:

      【解决方案2】:

      这有帮助吗?它会像您询问的那样获得搜索词的平均值。它使用 jquery $.each 来遍历数组

      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"))
      &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"&gt;&lt;/script&gt;

      【讨论】:

        【解决方案3】:

        您可以使用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)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多