给定一个数组[1,2,3,4],如何求其元素的和?(在这种情况下,总数为10。)
我认为每个美元可能有用,但我不确定如何实现它。
给定一个数组[1,2,3,4],如何求其元素的和?(在这种情况下,总数为10。)
我认为每个美元可能有用,但我不确定如何实现它。
当前回答
这里很酷的技巧,我对很多安全的传统答案进行了吹毛求疵,没有缓存数组的长度。
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
这可能是一种过时的心态,一直困扰着我,但我不认为在这种情况下使用它有什么缺点。
其他回答
使用递归
var sum = (arr) => arr.length === 1 ? arr[0] : arr.shift() + sum(arr);
sum([1,2,3,4]) // 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) 使用数组for Each
function total(arr) {
if(!Array.isArray(arr)) return;
let sum=0;
arr.forEach(each => {
sum+=each;
});
return sum;
};
并这样称呼它:
total(arr); //return 10
不建议将这样的东西原型化到Array。。。
var totally = eval(arr.join('+'))
这样你就可以在阵列中放置各种各样的异国情调的东西。
var arr = ['(1/3)','Date.now()','foo','bar()',1,2,3,4]
我只是半开玩笑。
此外,对于简单数组,使用es6求和。
const sum = [1, 2, 3].reduce((partial_sum, a) => partial_sum + a,0);
console.log(sum);
对于具有默认初始化值的对象数组
const totalAmount = obj =>
Object.values(obj).reduce((acc, { order_qty, mrp_price }) =>
acc + order_qty * mrp_price, 0);
console.log(totalAmount);
这里很酷的技巧,我对很多安全的传统答案进行了吹毛求疵,没有缓存数组的长度。
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
这可能是一种过时的心态,一直困扰着我,但我不认为在这种情况下使用它有什么缺点。