当前位置:  开发笔记 > 编程语言 > 正文

如何找到一组数字的总和

如何解决《如何找到一组数字的总和》经验,为你挑选了17个好方法。

给定一个数组[1, 2, 3, 4],我如何找到其元素的总和?(在这种情况下,总和将是10.)

我认为$.each可能有用,但我不确定如何实现它.



1> Florian Marg..:

在Lisp中,这正是它的工作reduce.你会看到这种代码:

(reduce #'+ '(1 2 3)) ; 6

幸运的是,在JavaScript中,我们也有reduce!不幸的是,+是一个操作员,而不是一个功能.但我们可以做到漂亮!在这里,看看:

const sum = [1, 2, 3].reduce(add,0); // with initial value to avoid when the array is empty

function add(accumulator, a) {
    return accumulator + a;
}

console.log(sum); // 6

不是很漂亮吗?:-)

更好!如果你正在使用ECMAScript 2015(又名ECMAScript 6),它可以是这样的:

const sum = [1, 2, 3].reduce((partial_sum, a) => partial_sum + a,0); 
console.log(sum); // 6


假设我们都使用ES2015,我们可以减少冗长:`[1,2,3] .reduce((a,b)=> a + b)`
@Black它将数组缩减为单个值.

2> OwChallie..:

推荐(默认值减少)

Array.prototype.reduce可用于迭代数组,将当前元素值添加到前一个元素值的总和.

console.log(
  [1, 2, 3, 4].reduce((a, b) => a + b, 0)
)
console.log(
  [].reduce((a, b) => a + b, 0)
)


3> Casey Rodarm..:

为什么不减少?它通常有点反直觉,但使用它来查找总和非常简单:

var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);


@ s4nji ...除非你正在减少酱汁 - 在这种情况下你要把它浓缩到它的基本要素,即所有口味的总和,没有水的开销.:-)
@Ishmael,您可以使用UnderscoreJS,如果可用,它将回退到浏览器的实现,或者实现自己的实现.
IE8不支持它,它看起来不像jQuery打算添加它.但是,Prototype有它.
什么是反对'reduce()`的反直觉?
@ s4nji`Array.prototype.reduce()`_reduces_一个返回值的数组.

4> Amber..:
var arr = [1,2,3,4];
var total=0;
for(var i in arr) { total += arr[i]; }


@Sprog:然而,使用`(var i = 0; i 在数组中使用`for ... in`循环在这种情况下_恰巧_并且因为数组扩展了对象.Riking的解决方案更好
这比上面的jQuery.each()解决方案更快.
@BenjaminGruenbaum规定,没有任何东西为数组的原型添加了可枚举的属性......

5> Tyler Carter..:
var total = 0;
$.each(arr,function() {
    total += this;
});


请,请使用下面的`reduce`回答; 当你没有变量时,不要声明可变的变量.
请不要使用它,即使它是"已接受的答案"; 以下Florian的答案要好得多!
@BrunoGrieder"当你不需要时,不要声明可变变量"对于*命令式语言来说是一种极端偏见的观点*,它几乎不是任何想象力的代码味道.泰勒的回答绝对没有错,泰勒和弗洛里安之间唯一的区别就是风格.
这个答案在[meta discussion]下(http://meta.stackoverflow.com/q/314157/871050)
来自OP:_我认为$ .each可能有用,但我不确定如何实现它.这可能不是最好的,但回答了OP的要求.
jQuery的`$ .each()`和朋友们在JS数组获得内置`.reduce()`,`.forEach()等之前是一个胜利(如果你对依赖性的肯定是好的)等等.现在内置`reduce `显然是写出它的唯一方法; 如果你仍然想支持缺少`.reduce`(并且不想要polyfill)的IE8,我会说回到`for`循环.
对这个答案的批评是​​荒谬的.这个问题专门标记了jquery并询问了$ .each.对于大多数人提出这个问题,减少正确的答案吗?当然是,但这就是为什么我们有多个答案和大脑来根据我们的具体用例来评估它们.

6> yckart..:

这可以通过循环遍历所有项目,并在每次迭代时将它们添加到sum-variable.

var array = [1, 2, 3];

for (var i = 0, sum = 0; i < array.length; sum += array[i++]);

JavaScript不知道块作用域,因此sum可以访问:

console.log(sum); // => 6

与上面相同,但注释和准备为一个简单的功能:

function sumArray(array) {
  for (
    var
      index = 0,              // The iterator
      length = array.length,  // Cache the array length
      sum = 0;                // The total amount
      index < length;         // The "for"-loop condition
      sum += array[index++]   // Add number on each iteration
  );
  return sum;
}


虽然很聪明,但我发现在循环外声明`sum`的代码更具可读性.

7> David says R..:

如果你碰巧使用Lodash,你可以使用sum函数

array = [1, 2, 3, 4];
sum = _.sum(array); // sum == 10



8> 小智..:
arr.reduce(function (a, b) {
    return a + b;
});

参考:Array.prototype.reduce()


添加一个默认值,如下所示:`arr.reduce(function(a,b){return a + b;},0);`
如果`arr`是`[]`,这将失败.

9> Riking..:
// Given array 'arr'
var i = arr.length;
var sum = 0;
while (--i) sum += arr[i];

这将平均花费1.57毫秒/运行(在100个随机正常数字的阵列上测量1000次运行),相比之下,使用上述eval()方法运行3.604毫秒/运行,运行标准为2.151毫秒/ (i,长度,++ )循环.

方法说明:此测试是在Google Apps脚本服务器上运行的,因此他们的javascript引擎与Chrome几乎完全相同.

编辑:--i代替i--节省0.12毫秒每次运行时(我-是1.7)

编辑:神圣的咒骂,不要介意这整篇文章.使用上面提到的reduce()方法,它只有1 ms/run.



10> 小智..:

您也可以使用reduceRight.

[1,2,3,4,5,6].reduceRight(function(a,b){return a+b;})

结果输出为21.

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight



11> electron..:

有趣的方法:

eval([1,2,3].join("+"))


请您解释一下这段代码中发生的事情,您可以扩展这个答案吗?它为什么有效?它究竟做了什么?这些东西有助于提高答案的质量.

12> Alireza..:

好吧,想象一下下面有这个数组:

const arr = [1, 2, 3, 4];

让我们开始研究许多不同的方法,因为我在这里找不到任何全面的答案:

1)使用内置的reduce()

function total(arr) {
  if(!Array.isArray(arr)) return;
  return arr.reduce((a, v)=>a + v);
}

2)使用for循环

function total(arr) {
  if(!Array.isArray(arr)) return;
  let totalNumber = 0;
  for (let i=0,l=arr.length; i

3)使用while循环

function total(arr) {
  if(!Array.isArray(arr)) return;
  let totalNumber = 0, i=-1;
  while (++i < arr.length) {
     totalNumber+=arr[i];
  }
  return totalNumber;
}

4)使用array forEach

function total(arr) {
  if(!Array.isArray(arr)) return;
  let sum=0;
  arr.forEach(each => {
    sum+=each;
  });
  return sum;
};

并称之为:

total(arr); //return 10

不建议将这样的原型原型化为Array ...



13> geek-merlin..:

有人在寻找像我一样的功能性oneliner吗?拿着这个:

sum= arr.reduce(function (a, b) {return a + b;}, 0);



14> 小智..:

标准的JavaScript解决方案:

var addition = [];
addition.push(2);
addition.push(3);

var total = 0;
for (var i = 0; i < addition.length; i++)
{
    total += addition[i];
}
alert(total);          // Just to output an example
/* console.log(total); // Just to output an example with Firebug */

这对我有用(结果应为5).我希望这种解决方案没有隐藏的劣势.



15> 小智..:

我是JavaScript和编码的初学者,但我发现在数组中对数字求和的简单方法就像这样:

    var myNumbers = [1,2,3,4,5]
    var total = 0;
    for(var i = 0; i < myNumbers.length; i++){
        total += myNumbers[i];
    }

基本上,我想做出贡献,因为我没有看到许多不使用内置函数的解决方案,而且这种方法易于编写和理解.



16> user40521..:
var totally = eval(arr.join('+'))

这样你就可以在阵列中放置各种奇特的东西.

var arr = ['(1/3)','Date.now()','foo','bar()',1,2,3,4]

我只是半开玩笑.


我笑了一半

17> 小智..:

一小段JavaScript代码即可完成此工作:

var numbers = [1,2,3,4];
var totalAmount = 0;

for (var x = 0; x < numbers.length; x++) {

    totalAmount += numbers[x];
}

console.log(totalAmount); //10 (1+2+3+4)

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有