JavaScript / JSON - 从多个数组

时间:2016-03-22 23:50:29

标签: javascript jquery arrays json

我从后端收到包含以下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;,我真的不知道如何使用我上面描述的方式计算平均值!

3 个答案:

答案 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来遍历数组

&#13;
&#13;
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;
&#13;
&#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)