Javascript 使用jQuery的数组中的值之和
我有一个包含一些值的数组,我想得到它们的和。以下是一个例子:Javascript 使用jQuery的数组中的值之和,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有一个包含一些值的数组,我想得到它们的和。以下是一个例子: var somearray = ["20","40","80","400"]; let num_of_fruits = ` This is a sentence where 1.25 values are oranges and 2.5 values are apples. How many fruits are there? `.split(/\s/g).reduce((p,c)=>p+(parseFl
var somearray = ["20","40","80","400"];
let num_of_fruits = `
This is a sentence where 1.25 values are oranges
and 2.5 values are apples. How many fruits are
there?
`.split(/\s/g).reduce((p,c)=>p+(parseFloat(c)||0), 0);
// num_of_fruits == 3.75
我想使用jQuery对这些值求和。在本例中,结果为540 您不需要jQuery。您可以使用
for
循环执行此操作:
var total = 0;
for (var i = 0; i < someArray.length; i++) {
total += someArray[i] << 0;
}
var总计=0;
for(var i=0;i 要同时处理浮点数,请执行以下操作:
- (旧版)JavaScript:
var arr = ["20.0","40.1","80.2","400.3"],
n = arr.length,
sum = 0;
while(n--)
sum += parseFloat(arr[n]) || 0;
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
arr.forEach(function(num){sum+=parseFloat(num) || 0;});
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0;});
- ECMA 5.1/6:
var arr = ["20.0","40.1","80.2","400.3"],
n = arr.length,
sum = 0;
while(n--)
sum += parseFloat(arr[n]) || 0;
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
arr.forEach(function(num){sum+=parseFloat(num) || 0;});
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0;});
- ES6:
var sum = ["20.0","40.1","80.2","400.3"].reduce((pv,cv)=>{
return pv + (parseFloat(cv)||0);
},0);
reduce()在较旧的ECMAScript版本中可用,箭头函数使此ES6变得特定
我将0作为第一个pv
值传入,因此我不需要对其进行浮点运算-它将始终保持上一个总和,该总和将始终是数字。因为当前值cv
,可以是非数字(NaN
),我们在其上使用| | 0
跳过数组中的该值。如果您想分解一个句子并获取其中的数字之和,这将非常棒。下面是一个更详细的示例:
var somearray = ["20","40","80","400"];
let num_of_fruits = `
This is a sentence where 1.25 values are oranges
and 2.5 values are apples. How many fruits are
there?
`.split(/\s/g).reduce((p,c)=>p+(parseFloat(c)||0), 0);
// num_of_fruits == 3.75
- jQuery:
var arr = ["20.0","40.1","80.2","400.3"],
n = arr.length,
sum = 0;
while(n--)
sum += parseFloat(arr[n]) || 0;
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
arr.forEach(function(num){sum+=parseFloat(num) || 0;});
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0;});
以上内容将带给您:
- 能够向数组中输入任何类型的值;数字或数字字符串(
123
或“123”
),浮点字符串或数字(“123.4”
或123.4
),甚至文本(abc
)
- 仅添加有效数字和/或数字字符串,忽略任何纯文本(例如[1,'a','2']和到3)
如果希望它成为jquery方法,可以这样做:
$.sum = function(arr) {
var r = 0;
$.each(arr, function(i, v) {
r += +v;
});
return r;
}
这样称呼它:
var sum = $.sum(["20", "40", "80", "400"]);
您可以使用reduce
,它适用于除IE8和更低版本之外的所有浏览器
["20","40","80","400"].reduce(function(a, b) {
return parseInt(a, 10) + parseInt(b, 10);
})
另一种方法,如果eval安全快速:
eval(["10","20","30","40","50"].join("+"))
很明显,jQuery开发人员有严重的心理问题。函数式编程启发了添加。不知何故,有一些基本的东西(如map)是好的,但没有其他东西(如reduce),除非它减少了jQuery的总体文件大小。如图所示
有用的是,有人将代码放置在jQuery数组的普通reduce函数中:
$.fn.reduce=[].reduce
现在我们可以使用一个简单的reduce函数来创建一个求和:
//where X is a jQuery array
X.reduce(function(a,b){ return a + b; });
// (change "a" into parseFloat("a") if the first a is a string)
最后,由于一些较旧的浏览器尚未实现reduce,因此可以从中获取polyfill(它很大,但我想它具有完全相同的行为,这是可取的):
if('function'!==typeof Array.prototype.reduce){
Array.prototype.reduce=函数(callback/*,initialValue*/){
"严格使用",;
if(null==此| |“未定义”==此的类型){
抛出新类型错误(
'Array.prototype.reduce在null或未定义时调用';
}
if('function'!==回调类型){
抛出新类型错误(回调+'不是函数');
}
var t=Object(this),len=t.length>>>0,k=0,value;
如果(arguments.length>=2){
值=参数[1];
}否则{
而(k=len)
抛出新的TypeError(“减少没有初始值的空数组”);
值=t[k++];
}
对于(;k
非常适合我的需要。谢谢vol7ron,你可以这样做
var somearray = ["20","40","80","400"];
somearray = somearray.map(Number);
var total = somearray.reduce(function(a,b){ return a+b },0)
console.log(total);
您不应该对数组使用for(someArray中的x)
,因为它枚举数组的可枚举属性,而不仅仅是数组元素。您应该对数组使用for(var i=0;i
。@jfriend00:谢谢!修复了它。Minor:缓存长度字段,这样它就不必在每次迭代时检查;for(变量i=0,len=someArray.length;i
@MarkByers@BeNdErR和@RIYAJKHAN,左移海报将每个元素作为字符串加载,因此您需要parseInt
,parseFloat
,或者乘以1。也可以在其中添加一个映射来分隔parseInt,但不要认为它会获得muchi会像这样加倍:)@AntonSemenichenko这仍然存在已知的本机缺陷,如浮点运算,因此请谨慎行事:)您不需要parseInt(a)
因为a
是前面的reduce
返回值,它已经是一个数字了。除了第一次调用,但是你可以添加0
作为reduce的参数,这样就可以了。这与我想要的最接近了。那么..jQuery是否有一个独立于浏览器的reduce(比如下划线?)?-天哪,这真是不可思议的愚蠢这是一个不可思议的解决方案。我不知道它的性能,它真的很奇怪。顺便说一句:如果可以的话,请永远不要使用eval。一般来说,确实不建议使用eval,因为人们很少能保证它是安全的,而且(我猜)它也不会比reduce快(很多)。为什么“从不使用eval”?我在上一份合同中不得不使用它,因为我们将JSON中的函数存储在数据库中(我没有设计它)。有时它是合适的解决方案。很好。我喜欢你的方法。更改为r+=parseInt(v);
,因为“20”
是字符串而不是整数。或者parseFloat(v)IE8不支持
。如果数组为空,也会引发错误,最好使用。reduce(函数(a,b){return a+b;},0)
在空数组上安全返回0。感谢@BeniCherniavsky Paskin。我已经更新了我的答案。感谢您包含了用于重用数组的超简单解决方案。reduce。它对我非常有用!