2014-10-17 64 views
0

使用JQuery,我从复选框值填充数组。然后,我创建了循环来遍历数组,将复选框的值解析为整数,然后将它们相加并赋值给一个变量“total”。当我运行这个时,我得到的不是一个数字,我怀疑某个循环有什么问题。有人能告诉我我在这里做错了什么。如果我的编码不够清晰,请原谅我,我刚刚从JS开始。parseInt数组和总和问题

// create array and push selected checkbox values to it 
 
    var allVals = []; 
 

 
    $('input:checkbox[name=brand]:checked').each(function() { 
 
     allVals.push($(this).val()); 
 
     //allVals.map(number); 
 
    }); 
 
     
 
    for (var i=0; i < allVals.length; i++) { 
 
     var total 
 
     allVals[i] = parseInt(allVals[i]); 
 
     total += allVals[i] << 0; 
 
     alert(total); 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+0

注意,目前的答案是一半错了 - 你确实必须初始化'total'为零(否则'未定义+ number'会'NaN'),但你不*必须在循环之外重定位该变量,因为* Javascript没有循环范围*。 – 2014-10-17 16:20:14

回答

-2

第一所有你必须在你的for循环之外创建总变量 然后将它初始化为零

var total = 0; 

for (var i=0; i < allVals.length; i++) { 

    allVals[i] = parseInt(allVals[i],10); 
    total += allVals[i]; 
    console.log(total); 
} 

因为要添加编号,以未初始化的变量 你正在为NaN导致

例如

var c; 
c +=1; //this will be NaN(not a numeric number) 

的原因是,当你初始化变量的JavaScript知道应给予该变量的正确数据类型

+0

这工作!非常感谢!我一直拉着我的头发几个小时试图让这个工作。我很感激! – exeleon 2014-10-17 16:25:34

+0

一个建议是在使用parseInt时总是将弧度设置为10,否则最终可能会出现八进制数字 – leopic 2014-10-17 17:16:57

+0

一个很好的通知,但是如果您没有指定基准,默认基数是基数10,所以parseInt('20')<=> parseInt函数( '20',10) – Ismail 2014-10-26 22:02:33

1

你声明totalfor内部因此它的每一次复位 - 我修改你的代码了一点,但这应该工作:

var numbers = $('input:checkbox[name=brand]:checked').map(function() { 
    return isNaN(this.value) ? 0 : this.value; 
}).get(); 

var total = 0; 

for (var i = 0; i < numbers.length; i++) { 
    total += numbers[i]; 
} 

alert(total); 
+0

@ArindamNayak - 如果'isNan'返回'true' - 那么'map'将返回'0' .... – tymeJV 2014-10-17 16:21:56

0

可能就这么简单:

$('[type=checkbox]').on('click', sum); 
 
    
 
function sum(e) { 
 
    var total = $('[type=checkbox]:checked') 
 
       .toArray() 
 
       .reduce(function (a,b) {return a + +b.value;}, 0); 
 
    $('[data-sum]').attr('data-sum', total.toFixed(2)); 
 
}
[data-sum] { 
 
    border-top: 1px solid #c0c0c0; 
 
    width: 100px 
 
} 
 

 
[data-sum]:before { 
 
    content: '\03A3 'attr(data-sum); 
 
    padding-left: 4px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="checkbox" value="23.23"> 23.23<br> 
 
<input type="checkbox" value="3.33"> 3.33<br> 
 
<input type="checkbox" value="15.00"> 15.00<br> 
 
<input type="checkbox" value="1101.22"> 1101.22<br> 
 
<input type="checkbox" value="78.10"> 78.10<br> 
 
<input type="checkbox" value="122.05"> 122.05<br> 
 
<input type="checkbox" value="435.00"> 435.00<br> 
 
<div data-sum="0"></div>