【问题标题】:Sum values in JSON response with jquery使用 jquery 对 JSON 响应中的值求和
【发布时间】:2014-01-23 16:54:52
【问题描述】:

我正在尝试使用 Jquery 在我的 JSON 中总结 col1、col2 和 col3,但不知道如何使用 .each 循环来完成它。另一个问题是 col1、col2 和 col3 是动态的,因此名称会发生​​变化。

这是我的 JSON 字符串:

 var data = [
{
    "Country": "Spain",
    "Year": "2012",
    "col1": "100.75",
    "col2": "500",
    "col3": "200"
},
{
    "Country": "Spain",
    "Year": "2013",
    "col1": "200",
    "col2": "500",
    "col3": "300"
},
{
    "Country": "France",
    "Year": "2011",
    "col1": "100",
    "col2": "100",
    "col3": "300"
},
{
    "Country": "France",
    "Year": "2012",
    "col1": "100",
    "col2": "100",
    "col3": "300"
},
{
    "Country": "France",
    "Year": "2013",
    "col1": "100",
    "col2": "200",
    "col3": "300"
}
]

http://jsfiddle.net/RHLKa/

我想要两个看起来像这样的结果:

1) 每个国家/地区的总数

Spain 300.75, 1000, 500
France 300, 400, 900

2) 总计:

["col1", 600.75],
["col2", 1400],
["col3", 1400]

谢谢 干杯

【问题讨论】:

    标签: jquery json loops dynamic sum


    【解决方案1】:

    要存储结果,最好使用对象(或关联数组)。也不要混合应该应用和不应该应用的属性 - 您可以将它们存储在单独的数组中,这可能是配置文件中的属性或类似的东西。这是代码(jsFiddle):

    var countries = {},
        columns = {},
        sumCols = ['col1', 'col2', 'col3'];
    
    $.each(data, function(index, obj) {
        if (!countries[obj['Country']]) {
            countries[obj['Country']] = {};
        }
        $.each(sumCols, function (index, col) {
            if (!countries[obj['Country']][col]) {
                countries[obj['Country']][col] = 0;
            }
            if (!columns[col]) {
                columns[col] = 0;
            }
            var val = parseFloat(obj[col]);
            if (!isNaN(val)) {
                countries[obj['Country']][col] += val;
                columns[col] += val;
            }
        });
    });
    

    结果:

    {
        "Spain":{
            "col1":300.75,
            "col2":1000,
            "col3":500},
        "France":{
            "col1":300,
            "col2":400,
            "col3":900
        }
    }
    
    {
        "col1":600.75,
        "col2":1400,
        "col3":1400
    } 
    

    【讨论】:

      【解决方案2】:

      使用动态属性名称时您将面临的主要问题是 JavaScript 明确不保证顺序。因此,您无法真正将循环对象属性名称与数组索引相匹配。因此,您需要使用对象来存储结果。这是一段(不是非常优化的)应该可以工作的代码。如果需要,您可以在之后操作结果。

      var results = {};
      var totals = {};
      
      // Loop over the array of data
      for (var d = 0; d < data.length; d++) {
          var o = data[d];
          var country = o["Country"];
          var values = results[country] || {};
          // Since the column names may change, we need to loop over the object
          for (var key in o) {
              // Weed out the two known keys
              if (o.hasOwnProperty(key) && key.toLowerCase() != "country" && key.toLowerCase() != "year") {
                  // Now find the entry in the values obj that matches
                  var column = values[key] || 0;
                  // And the corresponding entry in the totals object
                  var totalsColumn = totals[key] || 0;
                  column += parseFloat(o[key]);
                  totalsColumn += parseFloat(o[key]);
                  values[key] = column;
                  totals[key] = totalsColumn;
              }
          }
          results[country] = values;
      }
      

      这会产生两个对象,results,如下所示:

      France:
          col1: 300
          col2: 400
          col3: 900
      Spain:
          col1: 300.75
          col2: 1000
          col3: 500
      

      还有totals,看起来像这样:

      col1: 600.75
      col2: 1400
      col3: 1400
      

      我将此发布到您的 fiddle 的更新版本中。

      【讨论】:

      • @ken.dunnigton 感谢这段代码。当我将它传递到 highcharts 时,总数需要以这种格式排列,我怎样才能像这样 var total = [[" col1", 600,75], ["col2",1400], ["col3",1400]]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多