【问题标题】:How to sum up distinct value using javascript如何使用javascript总结不同的价值
【发布时间】:2014-01-16 11:21:47
【问题描述】:

我想尝试从一个列表中总结出不同的价值。目前如果只有 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 的第二次出现。
所以是的,我应该如何确保它遍历整个列表以总结所有相似的值?

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

【问题讨论】:

  • 我不太了解这个脚本的效率,但我可以说你的嵌套for 循环是不必要的。你只使用变量j 来添加+1,所以你可以简单地做var j = i+1;, 。此外,您没有将 repeatFlag、tbxA2 和 tbxB2 声明为变量。
  • @Tyblitz 我需要嵌套的 for 循环来进行值比较。bt 这个循环的问题是,一旦找到下一个相似的值,它就会停止循环,而不是循环到最后找到其余类似值。那我该怎么做呢?
  • 一种方法是: 1) 列出[{"A":"Apple","C":3},{"A":"Orange","C":10}...]; 2) 对列表进行排序,使相同的As 一起出现; 3) 如果A 相等,则通过将每个C 添加到其前一项来“减少”列表。

标签: javascript loops


【解决方案1】:

试试这个:

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 "";

一些cmets:

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

【讨论】:

  • 现在看起来效率更高了!
  • @Oriol 我尝试从会话中读取数据,因为我的列表来自数据库而不是硬编码。这有用吗?因为我似乎无法让它工作..&lt;%List list = (List) session.getAttribute("list");%&gt; var data = list wld 这是对的吗?谢谢
  • 顺便说一句.. .B 和 .C 是什么?
  • @user2435903 您的代码似乎是我不知道的服务器端编程语言,所以我无能为力。但是我的代码在客户端运行,所以它们是独立的。
  • @user2435903 每个data[key] 是一个具有两个属性的对象:BC,其中包含与 A 列中的key 关联的 B 列和 C 列的总和。
猜你喜欢
  • 2021-10-03
  • 2021-03-26
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
相关资源
最近更新 更多