2015-10-13 85 views
0

我有VAT值的這個對象:jQuery對象:總結值A的所有實例,其中B值重複

[ 
{ 
"code": "2", 
"rate": "17.5%", 
"net": 0 
}, 
{ 
"code": "2", 
"rate": "17.5%", 
"net": 0 
}, 
{ 
"code": "1", 
"rate": "Zero Rated", 
"net": 0 
}, 
{ 
"code": "1", 
"rate": "Zero Rated", 
"net": 0 
}, 
{ 
"code": "4", 
"rate": "20%", 
"net": 304.7 
}, 
{ 
"code": "1", 
"rate": "Zero Rated", 
"net": 0 
}, 
{ 
"code": "4", 
"rate": "20%", 
"net": 1200.24 
}, 
{ 
"code": "4", 
"rate": "20%", 
"net": 5201.04 
}, 
{ 
"code": "4", 
"rate": "20%", 
"net": 1258.82 
}, 
{ 
"code": "4", 
"rate": "20%", 
"net": 629.41 
}, 
{ 
"code": "4", 
"rate": "20%", 
"net": 629.41 
} 
] 

我想要做的是,以顯示各自的價值的所有單獨的代碼總結出來的,即我想加上所有的淨值,其中增值稅代碼爲1,並顯示它(代碼,費率和總淨額),然後單獨顯示他們的增值稅代碼是2等。

我試過使用$ .each,創建一個新的對象,並比較兩者,並添加值或創建一個新的實例,其中的代碼是相等的,但它變得混亂和混亂:

var vatAnalysisItem = []; 

$.each(self.vat(), function(index) { 
    $.each(self.vat()[index], function(key1, value1) { 
    if(key1 == "code") { 
     if(vatAnalysisItem.length === 0) { 
     vatAnalysisItem.push({code: self.vat().code, rate: self.vat().rate, net: self.vat().net}); 
     } 
     else { 
     $.each(vatAnalysisItem, function(key2, value2) { 
      if(key2 == "code") 
      if(value in vatAnalysisItem) { 
       vatAnalysisItem[net] += self.vat().net; 
      } 
      else { 
       vatAnalysisItem.push({code: self.vat()[code], rate: self.vat().rate, net: self.vat().net}); 
      } 
     }); 
     } 
    } 
    }); 
}); 

。我不知道如何去做這件事。我將使用Knockout JS在View中顯示完整的值。

任何幫助將不勝感激!

+0

分享你試過的東西 –

+0

@ArunPJohny - 編輯帖子。正如我所說,它開始看起來很混亂,因爲它沒有做我所需要的,我意識到它可能不是做它的方式 – Pawel

+1

http://jsfiddle.net/arunpjohny/7Lzzute9/1/ ? –

回答

1

的排序順序可能是錯誤的,調整的味道。

var vm = { 
 
    data: ko.observableArray([]), 
 
    cumulativeData: ko.pureComputed(function() { 
 
    var result = {}; 
 
    vm.data().forEach(function(datum) { 
 
     var cumul = result[datum.code]; 
 
     if (!cumul) { 
 
     result[datum.code] = cumul = { 
 
      code: datum.code, 
 
      rate: datum.rate, 
 
      net: 0 
 
     }; 
 
     } 
 
     cumul.net += datum.net; 
 
    }); 
 
    return Object.keys(result).sort().map(function(code) { return result[code]; }); 
 
    }) 
 
}; 
 

 
ko.applyBindings(vm); 
 

 
var newData = [{"code":"2","rate":"17.5%","net":0},{"code":"2","rate":"17.5%","net":0},{"code":"1","rate":"Zero Rated","net":0},{"code":"1","rate":"Zero Rated","net":0},{"code":"4","rate":"20%","net":304.7},{"code":"1","rate":"Zero Rated","net":0},{"code":"4","rate":"20%","net":1200.24},{"code":"4","rate":"20%","net":5201.04},{"code":"4","rate":"20%","net":1258.82},{"code":"4","rate":"20%","net":629.41},{"code":"4","rate":"20%","net":629.41}]; 
 
vm.data(newData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<table data-bind="foreach: cumulativeData"> 
 
    <tr> 
 
    <td data-bind="text: code"></td> 
 
    <td data-bind="text: rate"></td> 
 
    <td data-bind="text: net"></td> 
 
    </tr> 
 
</table>

+0

輝煌,感謝您考慮KO,完美的作品! – Pawel

1

您可以使用一個簡單的循環與溫度的物體,像

var items = [{ 
 
    "code": "2", 
 
    "rate": "17.5%", 
 
    "net": 0 
 
}, { 
 
    "code": "2", 
 
    "rate": "17.5%", 
 
    "net": 0 
 
}, { 
 
    "code": "1", 
 
    "rate": "Zero Rated", 
 
    "net": 0 
 
}, { 
 
    "code": "1", 
 
    "rate": "Zero Rated", 
 
    "net": 0 
 
}, { 
 
    "code": "4", 
 
    "rate": "20%", 
 
    "net": 304.7 
 
}, { 
 
    "code": "1", 
 
    "rate": "Zero Rated", 
 
    "net": 0 
 
}, { 
 
    "code": "4", 
 
    "rate": "20%", 
 
    "net": 1200.24 
 
}, { 
 
    "code": "4", 
 
    "rate": "20%", 
 
    "net": 5201.04 
 
}, { 
 
    "code": "4", 
 
    "rate": "20%", 
 
    "net": 1258.82 
 
}, { 
 
    "code": "4", 
 
    "rate": "20%", 
 
    "net": 629.41 
 
}, { 
 
    "code": "4", 
 
    "rate": "20%", 
 
    "net": 629.41 
 
}]; 
 

 
var result = [], 
 
    tmp = {}; 
 
$.each(items, function(i, item) { 
 
    if (!tmp[item.code]) { 
 
    tmp[item.code] = { 
 
     "code": item.code, 
 
     "rate": item.rate, 
 
     "net": 0 
 
    }; 
 
    result.push(tmp[item.code]); 
 
    } 
 
    console.log(tmp[item.code]) 
 
    tmp[item.code].net += item.net; 
 
}); 
 

 
output.innerHTML = JSON.stringify(result, null, 2)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<pre id="output"></pre>

+0

再次感謝你! – Pawel

0

您可以使用代碼作爲一個新的對象鍵這將可以很容易地抓住你需要的信息:

var out = arr.reduce(function (p, c) { 
    var key = c.code; 
    if (!p[key]) p[key] = { rate: c.rate, net: 0} 
    p[key].net += c.net; 
    return p; 
}, {}); 

out['4'].net // 9223.619999999999 

輸出

{ 
    "1": { 
     "rate": "Zero Rated", 
     "net": 0 
    }, 
    "2": { 
     "rate": "17.5%", 
     "net": 0 
    }, 
    "4": { 
     "rate": "20%", 
     "net": 9223.619999999999 
    } 
} 

DEMO

相關問題