如何找到数字数组的总和

2020/09/20 01:01 · javascript ·  · 0评论

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

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

推荐(减少默认值)

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 + val; }, 0)
)

非数字输入

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

console.log(
  ["hi", 1, 2, "frog"].reduce((a, b) => a + b)
)

let 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('+'))
)

//This way is dangerous if the array is built
// from user input as it may be exploited eg: 

eval([1,"2;alert('Malicious code!')"].join('+'))

当然,显示警报并不是可能发生的最糟糕的事情。我将其包括在内的唯一原因是作为对Ortund问题的回答,因为我认为这没有得到澄清。

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

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

var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);
var arr = [1,2,3,4];
var total=0;
for(var i in arr) { total += arr[i]; }
var total = 0;
$.each(arr,function() {
    total += this;
});

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

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

这可以通过遍历所有项,并在每次迭代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;
}
arr.reduce(function (a, b) {
    return a + b;
});

参考:Array.prototype.reduce()

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

平均运行时间为1.57毫秒(在100个随机正常数的数组上测量1000次运行),而上述eval()方法的运行时间为3.604毫秒,标准(i,length,++的运行时间为2.151毫秒)循环。

方法论说明:该测试在Google Apps脚本服务器上运行,因此其javascript引擎与Chrome几乎相同。

编辑:--i而不是i--每次运行节省0.12毫秒(i--是1.7)

编辑:神圣的咒骂,不要介意这整个职位。使用上面提到的reduce()方法,每次运行只有1毫秒。

您也可以使用reduceRight。

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

结果输出为21。

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

是否有人在寻找像我这样的功能齐全的内衬?拿着这个:

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

好吧,假设您在下面有这个数组:

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这样的东西制作原型...

有趣的方法:

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

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

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

这样,您可以将各种奇特的东西放入数组中。

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

我只是在开玩笑。

我一般是JavaScript和编码的初学者,但我发现一种简单易行的方法将数组中的数字相加是这样的:

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

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

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

少数人建议向中添加一个.sum()方法Array.prototype通常认为这是不好的做法,因此我不建议您这样做。

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

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

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

请注意,添加到原型的函数使用的是ES5和ES6函数以及箭头语法的混合体。function声明允许方法来获取this从上下文Array,你操作上。=>为了方便起见,reduce电话中使用了

使用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

没必要initial value因为如果没有initial value传递,callback function则不会在列表的第一个元素上调用,而是将第一个元素作为传递initial value非常ç OO L具有:)

[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

这是一种使用堆栈算法的优雅的单线解决方案,尽管您可能需要一些时间来了解此实现的优点。

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

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

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

此代码段的优点在于该函数包括arr[0]检查以防止无限循环。一旦到达最后一项,它将返回全部金额。

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

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

reduce

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

let sum = arr.reduce((v, i) => (v + i));

console.log(sum);

我看到了“减少”解决方案的所有答案

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

当数组由字符串组成时,必须更改代码。如果数组是数据库请求的结果,则可能是这种情况。此代码有效:

alert(
["1", "2", "3", "4"].reduce((a, b) => Number(a) + Number(b), 0)
);

此处,[“ 1”,“ 2”,“ 3”,“ 4”]组成字符串数组,该函数Number()将字符串转换为数字。

准确性

排序数组和起始和形成最小的数字(摘要显示与非排序的差异)

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

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

这里的技巧很酷,我选择了很多安全的传统答案,而不用担心数组的长度。

function arraySum(array){
  var total = 0,
      len = array.length;

  for (var i = 0; i < len; i++){
    total += array[i];
  }

  return total;
};

var my_array = [1,2,3,4];

// Returns 10
console.log( arraySum( my_array ) );

在不缓存数组长度的情况下,JS编译器需要在每次循环迭代时遍历数组以计算长度,在大多数情况下这是不必要的开销。V8和许多现代浏览器为我们优化了此功能,因此,它比以前少了一个问题,但是有一些较旧的设备受益于这种简单的缓存。

如果长度可能会发生变化,那么如果您不知道为什么要缓存长度,则缓存的操作可能会导致一些意外的副作用,但是对于可重用的函数,其唯一目的是获取数组并将值相加在一起,这就是非常适合。

这是此arraySum函数的CodePen链接。
http://codepen.io/brandonbrule/pen/ZGEJyV

这可能是我固守的过时思想,但我认为在这种情况下使用它并不不利。

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

Object.defineProperty(Object.prototype, 'sum', {
    enumerable:false,
    value:function() {
        var t=0;for(var i in this)
            if (!isNaN(this[i]))
                t+=this[i];
        return t;
    }
});

[20,25,27.1].sum()                 // 72.1
[10,"forty-two",23].sum()          // 33
[Math.PI,0,-1,1].sum()             // 3.141592653589793
[Math.PI,Math.E,-1000000000].sum() // -999999994.1401255

o = {a:1,b:31,c:"roffelz",someOtherProperty:21.52}
console.log(o.sum());              // 53.519999999999996

这容易得多

function sumArray(arr) {
    var total = 0;
    arr.forEach(function(element){
        total += element;
    })
    return total;
}

var sum = sumArray([1,2,3,4])

console.log(sum)
本文地址:http://javascript.askforanswer.com/ruhezhaodaoshuzishuzudezonghe.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!