循环遍历对象数组并按对象元素 id 返回每个总值的总和

Adr*_* P. 2 javascript arrays jquery loops object

我正在为一种非常复杂的发票方法计算税款。我无法解释整个过程,但如果您有任何问题,我会尽我所能回答。

我在 JS 中提出了一组对象:

[
 {row_id: "20003859", expense_id: "429", tax_select: "tax1", tax_id: "1", tax_name: "GST 5%", tax_no: "", tax_value: "13.23"}, 
 {row_id: "20003859", expense_id: "429", tax_select: "tax2", tax_id: "3", tax_name: "QST 9.975%", tax_no: "", tax_value: "26.38"}, 
 {row_id: "20003840", expense_id: "409", tax_select: "tax1", tax_id: "1", tax_name: "GST 5%", tax_no: "", tax_value: "13.23"}, 
 {row_id: "20003840", expense_id: "409", tax_select: "tax2", tax_id: "3", tax_name: "QST 9.975%", tax_no: "", tax_value: "26.38"},
 {row_id: "20003870", expense_id: "419", tax_select: "tax1", tax_id: "2", tax_name: "HST 13%", tax_no: "", tax_value: "34.39"}
]
Run Code Online (Sandbox Code Playgroud)

如您所见,我有 3 个 tax_id:1、2 和 3。我可以有很多,但为了简单起见,我只放了 3 个。

我需要遍历这个对象数组,并提出另一个对象数组,其总数按 tax_id:

[
 {tax_name: "GST 5%", total_tax: sum of tax_value for tax_id = 1},
 {tax_name: "QST 9.975%", total_tax: sum of tax_value for tax_id = 3},
 {tax_name: "HST 13%", sum of tax_value for tax_id = 2}
]
Run Code Online (Sandbox Code Playgroud)

之后,我可以遍历这个数组并显示每个税的总计,添加小计并显示总发票。

另外,我应该按 tax_select 对它们进行排序,但这是我可以接受的。

我曾尝试:其中 selected_taxes 是第一个对象数组

 for (i = 0; i < selected_taxes.length; i++){
        var sum = 0;
    $.each( selected_taxes[i], function( tax_id, tax_value ) {
        sum += tax_value;
    });
    console.log(sum);
 }
Run Code Online (Sandbox Code Playgroud)

但没有运气。

非常感谢您的帮助或建议。

Eth*_*own 5

我认为这Array.prototype.reduce将是您最好的选择:

var totals = data.reduce(function(c,x){
    if(!c[x.tax_id]) c[x.tax_id] = {
        tax_name: x.tax_name,
        tax_id: x.tax_id, 
        total_tax: 0
    };
    c[x.tax_id].total_tax += Number(x.tax_value);
    return c;
}, {});
Run Code Online (Sandbox Code Playgroud)

这种方法会生成一个对象,该对象的属性是税号。如果你真的想要一个平面数组,你可以事后将它转换成一个数组:

var totalsArray = [];
for(var taxId in totals){
    totalsArray.push(totals[taxId]):
}
Run Code Online (Sandbox Code Playgroud)

演示:http : //jsfiddle.net/3jaJC/1/