2012-07-13 39 views
0

我有類似this的json。在JSON有對象名稱tipe,我想總結act_qty1act_val1acvqtyacvvalbudqtybudvalcm_val1cm_val2cm_val3在同一TIPE(例如,總結他們在那裏他們tipe是 「ESL」)。如何在javascript中求和?它可以用循環完成嗎?如何從幾個條件(例如,來自對象「TYPE」的值是「ABC」)的特定json對象中求和值?

這裏是我到目前爲止做出:

function detail(kodenegara, koderesult) 
     { 
      $.mobile.showPageLoadingMsg(); 
      $.ajax({ 
       type: "GET", 
       contentType: "application/json; charset=utf-8", 
       url: "http://www.greenfields.co.id:502/Service1.svc/"+kodenegara, 
       dataType: "json", 
       success:function(data){ 
        var result = koderesult; 

        var details = ""; 

        for (i = 0; i < data[result].length; i++){ 
         $("#"+data[result][i].tipe).empty(); 
        } 
        for (i = 0, types={} ; i < data[result].length; i++){ 
         $("#"+data[result][i].tipe).append("<tr>"+ 
          "<td>"+data[result][i].mc+"</td>"+ 
          "<td>"+data[result][i].value3+"</td>"+ 
          "<td>"+data[result][i].value2+"</td>"+ 
          "<td>"+data[result][i].value1+"</td>"+ 
          "<td>"+data[result][i].avgqty+"</td>"+ 
          "<td>"+data[result][i].budqty+"</td>"+ 
          "<td>"+data[result][i].budval+"</td>"+ 
          "<td>"+data[result][i].acvqty+"</td>"+ 
          "<td>"+data[result][i].acvval+"</td>"+ 
          "</tr>").trigger('create'); 


          //----------------------------------// 
          // HERE IS what I've made TO SUM THE VALUES // 
          //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv// 

          for(i = 0; i < data[result].length; i++) { 
        if(data[result][i].tipe == 'ESL') 
        { 
         //how to summing data[result][i].cm_val3 where data[result][i].tipe == 'ESL' 
             var b = i + 1; 
          var test = parseInt(data[result][i].cm_val3) + parseInt(data[result][b].cm_val3) 
        } 
       } 

        } 

        //show the page 
        $.mobile.changePage("#detail_"+kodenegara, "slide", false, true); 
       }, 
       error: function() { 
        alert("ERROR"); 
       } 
      }); 
     } 

我不知道怎麼寫正確的循環求和的價值,同時tipe是「ESL」(或「ESL1L」或「WHP 「 要不然)。如果我使用這個:

var b = i + 1; 
var test = parseInt(data[result][i].cm_val3) + parseInt(data[result][b].cm_val3) 

只有最後一個數組的總和。如何編寫正確的循環以與該條件相加?

回答

1

來這裏工作小提琴 http://jsfiddle.net/xKJn8/1/

var SumByTipe = {}; 
for(i in data.GetReportIdResult){ 
    var currtipe = data.GetReportIdResult[i].tipe; 
    if (currtipe){ 
     if (currtipe in SumByTipe){ 
      for (j in data.GetReportIdResult[i]){ 
       if (j != "tipe" && j != "mc"){ 
        SumByTipe[currtipe][j + '_total'] += parseFloat(data.GetReportIdResult[i][j]); 
       } 
      } 
     }else{ 
      var firstSum = {}; 
      for (j in data.GetReportIdResult[i]){ 
       if (j != "tipe" && j != "mc"){ 
        firstSum[j + '_total'] = parseFloat(data.GetReportIdResult[i][j]); 
       } 
      } 
      SumByTipe[currtipe]=firstSum; 
     } 
    } 
} 
console.debug(SumByTipe); 
+0

它完美:d這恰恰正是我需要的。非常感謝你的隊友:) – blankon91 2012-07-13 09:27:13

+1

打開螢火蟲,看看打印出來的是什麼 – 2012-07-13 09:29:32

+0

再次感謝您的答案,但我再次遇到問題,我想從這些總結中分離出一些數值[mc](例如If 'mc'的數量是5,那麼我想要'parseFloat(SumByTipe ['ESL'] ['cm1_per1_total])/ 5')怎麼做?謝謝:) – blankon91 2012-07-18 01:15:45

1

這應該做的伎倆:

var sum_cm_val3=0; 

for (var i=0;i<data[result].length;i++) { 
    if (data[result][i].tipe == "ESL") { 
     var cm_val3 = data[result][i].cm_val3; 
     if (parseInt(cm_val3)==cm_val3) { 
      sum_cm_val3 += parseInt(cm_val3); 
     } 
    } 
} 
+0

非常感謝您的幫助:D也有幫助 – blankon91 2012-07-13 09:32:33

+0

您想彙總除mc和tipe以外的每個字段嗎? – 2012-07-13 09:35:07

+0

是的,但在某些情況下,我只是想用代碼有創造之前,所以基本上我需要在這裏的所有答案:D – blankon91 2012-07-13 09:50:05