ChatGPT解决这个技术问题 Extra ChatGPT

如何找到一个数字数组的总和

给定一个数组 [1, 2, 3, 4],我怎样才能找到它的元素之和? (在这种情况下,总和为 10。)

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

@tereško 不愿意谷歌不是 Stackoverflow 上的有效关闭理由。如果您觉得这个问题没有很好地(重新)搜索,请投反对票。 (同样从答案来看——这似乎是一个极具争议的话题,有许多可能的解决方案,包括一些高度赞成的不良做法(eval)——令人惊讶。)
注意:这里的大多数答案本质上是计算 a[0] + a[1] + ...,如果数组包含非数字元素,它可以变成字符串连接。例如['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
没有内置的减速器可以提供给 Array.reduce?想像[1,2,3].reduce(Math.sum)这样的东西。

R
Ry-

这正是 reduce 的工作。

如果您使用的是 ECMAScript 2015(又名 ECMAScript 6):

const sum = [1, 2, 3].reduce((partialSum, a) => partialSum + a, 0);控制台.log(总和); // 6

对于较旧的 JS:

const sum = [1, 2, 3].reduce(add, 0); // 当数组为空时避免初始值 function add(accumulator, a) { return accumulator + a; } 控制台日志(总和); // 6

那不是很漂亮吗? :-)


假设我们都使用 ES2015,我们可以让它不那么冗长:[1, 2, 3].reduce((a,b)=>a+b)
实际上,在 lisp 中,(apply #'+ '(1 2 3)) 会更有效。我很惊讶在 JavaScript 中不能做同样的事情。我想如果我可以Math.max.apply(Math,[-12,-3.33,11,0,1]),那么为什么不能Math.sum.apply(Math,[-12,-3.33,11,0,1])
很可爱:)
很遗憾 Array 原型不支持 sum()。使用 reduce() 会混淆意图。
S
Stan Kurdziel

推荐(使用默认值减少)

Array.prototype.reduce 可用于遍历数组,将当前元素值与之前元素值的总和相加。

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

无默认值

你得到一个 TypeError

console.log( [].reduce((a, b) => a + b) )

在 ES6 的箭头函数之前

console.log( [1,2,3].reduce(function(acc, val) { return acc + val; }, 0) ) console.log( [].reduce(function(acc, val) { return acc +值;}, 0))

非数字输入

如果非数字是可能的输入,您可能想要处理它?

console.log( ["hi", 1, 2, "frog"].reduce((a, b) => a + b) ) 让 numOr0 = n => isNaN(n) ? 0 : n console.log( ["hi", 1, 2, "frog"].reduce((a, b) => numOr0(a) + numOr0(b)) )

不推荐的危险评估使用

我们可以使用 eval 来执行 JavaScript 代码的字符串表示。使用 Array.prototype.join 函数将数组转换为字符串,我们将 [1,2,3] 更改为“1+2+3”,计算结果为 6。

console.log( eval([1,2,3].join('+')) ) //如果数组是根据用户输入构建的,这种方式很危险 // 因为它可能被利用,例如:eval([1, "2;alert('恶意代码!')"].join('+'))

当然,显示警报并不是可能发生的最糟糕的事情。我包含此内容的唯一原因是作为 Ortund 问题的答案,因为我认为它没有得到澄清。


您是否知道,经过多年的使用 reduce() 的魔法仍然比简单的索引 for() 循环慢 25-30%? jsperf.com/reduce-vs-loop/4
P
Peter Mortensen

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

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

IE8 不支持它,而且看起来 jQuery 也不打算添加它。但是,原型有它。
@Ishmael,您可以使用UnderscoreJS,如果可用,它会回退到浏览器的实现,否则就实现它自己的。
reduce() 有什么反直觉的?
@s4nji Array.prototype.reduce() 减少 数组为单个返回值。
@s4nji ...除非您要减少酱汁-在这种情况下,您将其归结为其基本要素,即所有口味的总和,而没有头顶的水。 :-)
K
Kartikey
var arr = [1, 2, 3, 4];
var total = 0;
for (var i in arr) {
  total += arr[i];
}

这比上面的 jQuery.each() 解决方案要快得多。
@Sprog:但是,使用 (var i=0; i<arr.length; i++) 更快。即便如此,使用 var sum=0; var i=arr.length; while(i--) sum += arr[i] 仍然更快。
在这种情况下,在数组上使用 for... in 循环是有效的_巧合_并且因为数组扩展了对象。 Riking的解决方案更好
@BenjaminGruenbaum 前提是没有任何东西向数组的原型添加可枚举属性...
@YSC 不,它没有。 JavaScript 中的 for...in 循环获取索引,这对于希望获取值的编码人员来说是一个常见的绊脚石。 (在控制台中尝试 for(var i in [1,2,3]) { console.log(i); }。)
T
Tyler Carter
var total = 0;
$.each(arr,function() {
    total += this;
});

请,请,请使用下面reduce的答案;当你没有可变变量时,不要声明可变变量。
此答案在 meta discussion
请不要使用它,即使它是“公认的答案”;下面弗洛里安的回答要好得多!
@BrunoGrieder“当你不需要时不要声明可变变量”是关于命令式语言的一种极其有偏见的观点,它几乎不是任何想象中的代码味道。泰勒的回答绝对没有错,泰勒和弗洛里安的唯一区别就是风格。
对这个答案的批评是荒谬的。该问题专门标记 jquery 并询问 $.each。对于大多数问这个问题的人来说,减少是正确的答案吗?当然是这样,但这就是为什么我们有多个答案和大脑来根据我们的特定用例来评估它们。
g
geek-merlin

任何人都在寻找像我这样的功能性oneliner?

假设:

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

这是现代 JS 的 oneliner:

sum = arr.reduce((a, b) => a + b, 0);

(如果你碰巧必须支持没有箭头功能的老 IE:)

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

请注意,此处 0 是初始值,因此您可以根据需要将其用作偏移量。还要注意这个初始值是需要的,否则用空数组调用函数会出错。


s
simhumileco

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

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

也可以很好地与 Typescript 一起使用。
这些答案是怎么回事?他没有标记lodash,上面还有很多更好的答案。此外,这有点像说“如果你碰巧在使用 python,你可以做到这一点”。
如果你碰巧没有使用 lodash,你可以 npm 它.. 不冒犯戏剧女王 @Blaze612YT
@LastTribunal 我只是说这些答案应该是评论,因为它们不是完整的答案,就像您碰巧在使用某些东西一样。
y
yckart

这可以通过循环遍历所有项目,并在每次迭代中将它们添加到 sum 变量中来实现。

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 的代码更具可读性。
@BeniCherniavsky-Paskin 是的,这里也一样...不知道为什么那天我会这样做...但是,我会顺其自然!这只是我们如何可能的一个例子...... ;)
从 ES6 开始,javascript 确实知道 constlet 的块范围。因此,您可以在 for 循环之外将 sum 声明为 let sum = 0;。您还可以在循环之前将数组长度缓存为 const length = array.length;
P
Peter Mortensen
arr.reduce(function (a, b) {
    return a + b;
});

参考:Array.prototype.reduce()


如果 arr[],这将失败。
添加默认值,如下所示:arr.reduce(function (a, b) { return a + b; }, 0);
A
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<l; i++) {
     totalNumber+=arr[i];
  }
  return totalNumber;
}

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) 使用数组 forEach

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

并这样称呼它:

total(arr); //return 10

不建议将这样的原型制作成 Array ...


R
Rohit Bhalke

您也可以使用 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


在 chrome 中应该更快,因为对 javascript 循环的优化(即减少长度)也可以应用于底层程序集以使其运行得更快。
e
electron

有趣的方法:

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

请您通过解释此代码中发生的情况来扩展此答案吗?为什么它有效?它究竟是做什么的?这些东西有助于提高答案的质量。
@user40521 已经按照我的想法回答了这个问题。我没看到。
虽然这很简短,而且很有趣,但它也非常低效。对于大多数(如果不是全部)情况,使用 reduce 绝对是更可取的。
嗯,[1,"2;YourProgram.ripToShreds();3",4]
所以我在尝试 eval(['alert("removing your computer")',2,3].join("+")) 错误答案时得到 NaN 0/10
S
Simon Baumgardt-Wellander

一个标准的 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)。我希望这种解决方案没有隐藏的缺点。


此外,任何 C 或 Java 程序员都能够理解这一点。
出于总结所有值的简单目的,简单的普通旧 for 循环在执行时间方面没有竞争对手
唯一的问题是,当你有 20 个相互嵌套的 for 循环时,这有点烦人
C
Community

我是 JavaScript 和一般编码的初学者,但我发现对数组中的数字求和的简单方法如下:

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

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


这与 this 2012 answerthis 2014 answer 有何不同?有两个你没见过的解决方案。
M
Md.Shakil Shaikh

您可以尝试以下代码:

[1, 2, 3, 4].reduce((pre,curr)=>pre+curr,0)

H
Hunter

使用 for 循环:

const array = [1, 2, 3, 4];
let result = 0;

for (let i = 0; i < array.length - 1; i++) {
  result += array[i];
}

console.log(result); // Should give 10

甚至是 forEach 循环:

const array = [1, 2, 3, 4];
let result = 0;

array.forEach(number => {
  result += number;
})

console.log(result); // Should give 10

为简单起见,使用 reduce

const array = [10, 20, 30, 40];
const add = (a, b) => a + b
const result = array.reduce(add);

console.log(result); // Should give 100

u
user40521
var totally = eval(arr.join('+'))

这样你就可以把各种奇特的东西放在数组中。

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

我只是半开玩笑。


我笑了一半
eval(['alert("removing your computer")',2,3].join("+"))
G
Guy

一些人建议向 Array.prototype 添加一个 .sum() 方法。这通常被认为是不好的做法,所以我不建议你这样做。

如果您仍然坚持这样做,那么这是一种简洁的写法:

Array.prototype.sum = function() {return [].reduce.call(this, (a,i) => a+i, 0);}

然后:[1,2].sum(); // 3

请注意,添加到原型中的函数混合使用了 ES5 和 ES6 函数和箭头语法。声明 function 以允许该方法从您正在操作的 Array 获取 this 上下文。为了简洁起见,我在 reduce 调用中使用了 =>


如果您要弄乱原型(而且您不应该),Math.prototype.sum 方法会更合适。
c
caiohamamura

ES6 for..of

let total = 0;

for (let value of [1, 2, 3, 4]) {
    total += value; 
}

P
Peter Mortensen

一小段 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)

P
Paul Roub

使用reduce

让 arr = [1, 2, 3, 4];让 sum = arr.reduce((v, i) => (v + i));控制台.log(总和);


Y
Yas

无需initial value!因为如果没有传递 initial value,则不会在列表的第一个元素上调用 callback function,而是将第一个元素作为 initial value 传递。非常 cOOl 的功能:)

[1, 2, 3, 4].reduce((a, x) => a + x) // 10
[1, 2, 3, 4].reduce((a, x) => a * x) // 24
[1, 2, 3, 4].reduce((a, x) => Math.max(a, x)) // 4
[1, 2, 3, 4].reduce((a, x) => Math.min(a, x)) // 1

R
Rex Low

这是一个使用 stack algorithm 的优雅的单行解决方案,但可能需要一些时间才能了解此实现的美妙之处。

const getSum = arr => (arr.length === 1) ? arr[0] : arr.pop() + getSum(arr);

getSum([1, 2, 3, 4, 5]) //15

基本上,该函数接受一个数组并检查该数组是否恰好包含一项。如果为 false,则将最后一项从堆栈中弹出并返回更新后的数组。

此代码段的美妙之处在于该函数包含 arr[0] 检查以防止无限循环。一旦到达最后一项,它就会返回整个总和。


优雅的?更像是太复杂了
递归方式
K
Kamil Kiełczewski

准确性

对数组进行排序并从最小数字开始求和(片段显示与非排序的差异)

[...arr].sort((a,b)=>a-b).reduce((a,c)=>a+c,0)

arr=[.6,9,.1,.1,.1,.1] sum = arr.reduce((a,c)=>a+c,0) sortSum = [...arr].sort( (a,b)=>ab).reduce((a,c)=>a+c,0) console.log('sum:',sum); console.log('sortSum:',sortSum); console.log('sum==sortSum :', sum==sortSum); // 我们使用 .sort((a,b)=>ab) 代替 .sort() 因为 // 第二个将元素视为字符串(因此方式错误) // 例如 [1,10,9,20,93 ].sort() --> [1, 10, 20, 9, 93]

对于数字的多维数组,使用 arr.flat(Infinity)

arr= [ [ [1,2,3,4],[1,2,3,4],[1,2,3,4] ], [ [1,2,3,4],[1,2 ,3,4],[1,2,3,4] ] ]; sum = arr.flat(Infinity).reduce((a,c)=> a+c,0);控制台.log(总和); // 60


S
Santosh

这些确实是很好的答案,但以防万一数字按问题(1,2,3,4)中的顺序排列,您可以通过应用公式 (n*(n+1))/2 轻松做到这一点,其中n 是最后一个数字


完全同意,如果数组编号按顺序排列,这是最有效的方法。高斯和连续数公式 var array = [1, 2, 3, 4]; var n = 数组长度;变量总和 = n/2 * (1+4)
a
antonjs

您可以将 reduce() 方法与 lambda 表达式结合使用:

[1, 2, 3, 4].reduce((accumulator, currentValue) => accumulator + currentValue);

A
Ahmad Moghazi

使用减少()

[1, 2, 3, 4].reduce((a, b) => a + b, 0); // 10

使用 forEach()

let sum = 0;
[1, 2, 3, 4].forEach(n => sum += n);
sum; // 10

带参数

function arrSum(arr) { 
  sum = 0;  
  arr.forEach(n => sum += n); 
  return sum; 
}

arrSum([1, 2, 3, 4]) // 10

A
Adrian Swifter

我看到所有答案都是“减少”解决方案

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

b
bahri noredine

很简单

第 1 步我们应该有一个像这样的数组:

const arrayNumber = [500,152,154,1555,12445];

第2步(如果您可以忽略此步骤)步骤是确保表中的所有值都是该数字

let newArray = [];
for (let i = 0; i < arrayNumber.length; i++) {
        newArray.push(parseInt(arrayNumber[i], 10));
      }

第 3 步

const sumInArray = dataData.reduce( (a, b) => a + b);

最后

console.log(sumInArray);

S
Shoaib Khalil

了解底层过程的最简单答案:

let array = [10, 20, 30, 40, 50]
let total = 0

for(let i in array)
{
    total += array[i]
}

console.log(total)

& 如果您已经熟悉底层流程,那么内置方法可以节省您的时间:

let array = [10, 20, 30, 40, 50]
let total = array.reduce((x, y) => x + y)
console.log(total)