如何使用javascript总结不同的价值

时间:2014-01-16 02:30:55

标签: javascript loops

我想尝试从列表中总结出不同的值..目前我能够这样做,如果只有2个类似的记录。如果超过2我无法进行检查。以下是javascript代码:

function validateData(){
    var total = document.frm.size.value;
    var msg="";
    var tbxA;
    var tbxB;
    var tbxA2;
    var tbxB2;
    var tbxC;
    var totalValue =0;
    var repeatedValue= 0;
    var row = 0;      
    var row2 = 0;   

    for(var i=0; i<parseInt(total); i++){
        tbxA = document.getElementById('tbx_A'+i).value;
        tbxB = document.getElementById('tbx_B'+i).value-0;
        tbxC = document.getElementById('tbx_C'+i).value;
        for(var j=i+1; j<parseInt(total); j++){
            tbxA2 = document.getElementById('tbx_A'+j).value;
            tbxB2 = document.getElementById('tbx_B'+j).value-0;

            if (tbxA==tbxA2) {
                totalValue = tbxB + tbxB2;
            }
                if (totalValue != tbxC) {
                    repeatedValue= 1;
                    row = i;
                    row2 = j;
                    msg+="*total value  does not add up at row " +(row2+1);
                    break;
                }
        }
        if(repeatedValue== 1){  
        break;
        }
    }
    return msg;
}

例如A:水果的种类,B:每种水果的总数,C:一次购买的数量为多少 C的总和应该等于B.即Apple:3 + 3 + 4 = 10.因此,如果总数不等于10,则应该提示我错误。

 A       B     C
 Apple   10    3
 Orange  10    10
 Apple   -     3
 Apple   -     4

上面的代码会提示错误,但它不会超出Apple的第二次出现 所以,是的,我应该如何确保它循环遍历整个列表以总结所有类似的值?

提前感谢您提供任何可能的帮助!

1 个答案:

答案 0 :(得分:2)

试试这个:

var total = +document.frm.size.value,
    data = {};
for(var i=0; i<total; ++i) {
    var key = document.getElementById('tbx_A'+i).value;
    data[key] = data[key] || {B:0, C:0};
    data[key].B += +document.getElementById('tbx_B'+i).value || 0;
    data[key].C += +document.getElementById('tbx_C'+i).value || 0;
}
for(var i in data) {
    if(data.hasOwnProperty(i) && data[i].B != data[i].C) {
        return "total value does not add up";
    }
}
return "";

一些意见:

  • parseInt(和parseFloat)非常慢。字符串前的+运算符将其转换为更快的数字。但如果你真的想确保数字是整数,请使用Math.floor()Math.round()Math.ceil()或更快但难以辨认的|0
  • 如果您确实需要parseInt(例如,您想将'123foobar'转换为123),请始终使用基数。例如:parseInt('123', 10)
  • 避免在循环条件下进行计算,因为它们在每次迭代时运行。只需在循环之前进行一次计算,并将结果保存在变量中。