Javascript 根据对象的术语将数据收集到对象中

Javascript 根据对象的术语将数据收集到对象中,javascript,jquery,Javascript,Jquery,我有以下发票数据: 我已经收集了每项价格的总税收值,并将其存储在带有税收术语名称键的对象上,正如您在控制台结果中看到的那样。例如,现在我想收集应用税术语的项目序列号vat@5适用于1至4和tax@22.75仅适用于5台。如果我使用另一个对象来存储应用的序号。那么很难按照它的术语来显示。是否有任何方法可以根据同一对象的税务条件推送该对象上的数据 var taxz = {}; var keyz = {}; for( var i = 0; i < Price.length; i++ ){

我有以下发票数据:

我已经收集了每项价格的总税收值,并将其存储在带有税收术语名称键的对象上,正如您在控制台结果中看到的那样。例如,现在我想收集应用税术语的项目序列号vat@5适用于1至4和tax@22.75仅适用于5台。如果我使用另一个对象来存储应用的序号。那么很难按照它的术语来显示。是否有任何方法可以根据同一对象的税务条件推送该对象上的数据

var taxz = {};
var keyz = {};

for( var i = 0; i < Price.length; i++ ){
    if( isNaN( Price[i] ) ){ $('td:eq(5)', TR[i+1]).html(""); }
    else { $('td:eq(5)', TR[i+1]).html(Price[i]); }

    if( ! isNaN(Price[i]) ) {

        var Tax_Name = $(Tax_TR[i]).find(":selected").text();
        var Tax_Val = ((Tax_TR[i].value) / 100 * Price[i]).toFixed(2);

        if( Tax_Name in taxz ) {
            //console.log('find');
            taxz[Tax_Name] = tax_sum(taxz, Tax_Name) + parseFloat(Tax_Val);

        }
        else {
            //console.log('not_find');
            taxz[Tax_Name] = tax_sum(taxz, Tax_Name) + parseFloat(Tax_Val);

        }
    }
}

console.log(taxz);


Object { "VAT@5"=158.5, "TAX@22.75"=56.88}

它工作正常,我在代码中添加了以下内容:

if( Tax_Name in taxz ) {
    //console.log('find');
    taxz[Tax_Name] = tax_sum(taxz, Tax_Name) + parseFloat(Tax_Val);
    taxz[Tax_Name+'_1'].push(i+1);
}
else {
    //console.log('not_find');
    taxz[Tax_Name] = tax_sum(taxz, Tax_Name) + parseFloat(Tax_Val);
    taxz[Tax_Name+'_1'] = [];
    taxz[Tax_Name+'_1'].push(i+1);
}
现在的结果是:

Object { VAT@5=158.5, VAT@5_1=[1, 2, 3, 4], TAX@22.75=56.88, TAX@22.75_1=[5]}

这就是我想要的。

哇!哇!哇!这段代码几乎不可读。如果你写这样的代码,它会给你带来麻烦。像这样的麻烦。避免嵌套的if-else语句以及隐藏的标识符,并尽可能遵循SRP和DRY原则。此外,还应仔细设置代码的格式。如果taxz中的taxname:您在每个分支上都做了完全相同的事情。条件反射的意义是什么?另外,我不确定我是否理解你的问题…@Powerslave如果你不理解,我很抱歉,但现在它起作用了,多亏了指出原则。我还添加了我自己问题的答案,我相信在检查了答案的控制台结果后,你会明白我的意思。我很高兴它起作用了。如果你不介意的话,我想加一个例子:在你的解决方案中,你违反了干燥原则。在条件分支中只有一行是不同的。为什么不把它仅仅放在一个条件作用域中呢?好像!taxz中的Tax_Name然后taxz[Tax_Name+''u 1']=[]并在公共范围内执行其他所有操作。除此之外,还有其他一些事情需要注意,但我现在真的不想深入讨论。