2014-01-23 28 views
0

我想總結一個col1,col2和col3在我的JSON使用jquery和不知道如何去做使用.each循環。另一個問題是col1,col2和col3是動態的,因此名稱將會改變。在JSON響應與jQuery的總和值

這是我的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/

我想兩個結果會是這個樣子:每個國家

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

1)彙總)總計:

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

感謝 乾杯

回答

2

要存儲結果,最好使用object(或關聯數組)。同樣,不要混合應該應用的屬性,也不要將它們混合在一起 - 您可以將它們存儲在單獨的數組中,這可能是配置文件中的屬性,也可能是像這樣的屬性。下面是代碼(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 
} 
1

你要面對動態屬性名稱工作的主要問題是,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

+0

@ ken.dunnigton感謝這片code.The總需要爲與這種格式數組作爲我傳遞這成高地圖,我怎麼能這樣得到它 var total = [[「col1」,600,75],[「col2」,1400],[「col3」,1400]] –