Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jQuery的数组中的值之和_Javascript_Jquery_Arrays - Fatal编程技术网

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。它对我非常有用!