给定一个数组[1, 2, 3, 4]
,如何找到其元素的总和?(在这种情况下,总和为10
。)
我以为$.each
可能有用,但是我不确定如何实现它。
a[0] + a[1] + ...
,如果数组包含非数字元素,则可以转换为字符串连接。例如['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
。
[1,2,3].reduce(Math.sum)
。
给定一个数组[1, 2, 3, 4]
,如何找到其元素的总和?(在这种情况下,总和为10
。)
我以为$.each
可能有用,但是我不确定如何实现它。
a[0] + a[1] + ...
,如果数组包含非数字元素,则可以转换为字符串连接。例如['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
。
[1,2,3].reduce(Math.sum)
。
Answers:
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)
)
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
[1, 2, 3].reduce((a,b)=>a+b)
Array.prototype.sum = function() { return this.reduce((a,b) => a+b, 0); }
Array.prototype.avg = function() { return this.reduce((a,b) => a+b, 0)/this.length; }
为什么不减少?通常,这有点反直观,但使用它来查找总和非常简单:
var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);
reduce()
什么?
Array.prototype.reduce()
将数组减少为单个返回值。
var arr = [1,2,3,4];
var total=0;
for(var i in arr) { total += arr[i]; }
(var i=0; i<arr.length; i++)
速度甚至更快。即使这样,使用var sum=0; var i=arr.length; while(i--) sum += arr[i]
速度仍然更快。
for... in
在这种情况下,_巧合地_可以在数组上使用循环,因为数组扩展了对象。Riking的解决方案更好
for...in
在JavaScript中环路采取指数,这对于期望得到的值编码器共同绊脚石。(for(var i in [1,2,3]) { console.log(i); }
在控制台中尝试。)
var total = 0;
$.each(arr,function() {
total += this;
});
reduce
下面的答案;如果没有,也不要声明可变的var。
这可以通过遍历所有项目,并在每次迭代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
在循环外声明的代码更具可读性。
const
和进行块作用域let
。因此,您可以sum
在for
循环外部将声明为let sum = 0;
。您还可以在循环之前缓存数组长度,例如const length = array.length;
arr.reduce(function (a, b) {
return a + b;
});
arr.reduce(function (a, b) { return a + b; }, 0);
// 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毫秒。
while (--i) do_something
可能也适用于其他事情。
var sum = arr[0]
您也可以使用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);
arr.reduce(function(a, b) { return a + b;}, 0);
有趣的方法:
eval([1,2,3].join("+"))
reduce
对于大多数(如果不是全部)情况,绝对优选使用。
[1,"2;YourProgram.ripToShreds();3",4]
NaN
在尝试eval(['alert("removing your computer")',2,3].join("+"))
错误答案0/10 时得到
好吧,假设您在下面有这个数组:
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 ...
标准的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)。我希望这种解决方案没有隐藏的缺点。
我一般是JavaScript和编码的初学者,但是我发现一种简单易行的方法将数组中的数字相加是这样的:
var myNumbers = [1,2,3,4,5]
var total = 0;
for(var i = 0; i < myNumbers.length; i++){
total += myNumbers[i];
}
基本上,我想为此做出贡献,因为我没有看到很多不使用内置函数的解决方案,而且这种方法易于编写和理解。
使用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
。非常有趣的功能:)
[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
采用 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)
排序数组和起始和形成最小的数字(摘要显示与非排序的差异)
[...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
这可能是我束手无策的一种过时的心态,但我认为在这种情况下使用它并不不利。
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)
一个简单的方法示例:
function add(array){
var arraylength = array.length;
var sum = 0;
for(var timesToMultiply = 0; timesToMultiply<arraylength; timesToMultiply++){
sum += array[timesToMultiply];
}
return sum;
}
console.log(add([1, 2, 3, 4]));