[英]How to find the sum of an array of numbers
這正是reduce
的工作。
如果您使用的是 ECMAScript 2015(又名ECMAScript 6 ):
const sum = [1, 2, 3].reduce((partialSum, a) => partialSum + a, 0); console.log(sum); // 6
對於較舊的 JS:
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
那不是很漂亮嗎? :-)
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 問題的答案,因為我認為它沒有得到澄清。
為什么不減? 這通常有點反直覺,但使用它來求和非常簡單:
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;
});
任何人都在尋找像我這樣的功能性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是初始值,因此您可以根據需要將其用作偏移量。 還要注意這個初始值是需要的,否則用空數組調用函數會出錯。
如果你碰巧使用 Lodash,你可以使用sum函數
array = [1, 2, 3, 4];
sum = _.sum(array); // sum == 10
這可以通過遍歷所有項目,並在每次迭代中將它們添加到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;
}
arr.reduce(function (a, b) {
return a + b;
});
// Given array 'arr'
var i = arr.length;
var sum = 0;
while (--i) sum += arr[i];
這將平均需要 1.57 毫秒/運行(在 100 個隨機正態數的數組上運行超過 1000 次),而使用上述eval()
方法為 3.604 毫秒/運行,使用標准 for(i,length eval()
運行需要 2.151 毫秒/運行,++) 循環。
方法說明:此測試在 Google Apps Script 服務器上運行,因此它們的 javascript 引擎與 Chrome 幾乎相同。
編輯:-- --i
而不是i--
每次運行節省 0.12 毫秒(i-- 為 1.7)
編輯:神聖的咒罵,別介意整篇文章。 使用上面提到的reduce()方法,它只有1ms/run。
好的,假設您在下面有這個數組:
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 ...
您也可以使用 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
有趣的方法:
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)。 我希望這種解決方案沒有隱藏的缺點。
我是 JavaScript 和一般編碼的初學者,但我發現對數組中的數字求和的簡單方法如下:
var myNumbers = [1,2,3,4,5]
var total = 0;
for(var i = 0; i < myNumbers.length; i++){
total += myNumbers[i];
}
基本上,我想貢獻這個是因為我沒有看到很多不使用內置函數的解決方案,而且這種方法易於編寫和理解。
您可以嘗試以下代碼:
[1, 2, 3, 4].reduce((pre,curr)=>pre+curr,0)
使用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
var totally = eval(arr.join('+'))
這樣你就可以把各種奇特的東西放在數組中。
var arr = ['(1/3)','Date.now()','foo','bar()',1,2,3,4]
我只是半開玩笑。
一些人建議在Array.prototype
中添加一個.sum()
方法。 這通常被認為是不好的做法,所以我不建議你這樣做。
如果您仍然堅持這樣做,那么這是一種簡潔的寫法:
Array.prototype.sum = function() {return [].reduce.call(this, (a,i) => a+i, 0);}
然后: [1,2].sum(); // 3
[1,2].sum(); // 3
請注意,添加到原型中的函數混合使用了 ES5 和 ES6 函數和箭頭語法。 聲明該function
以允許該方法從您正在操作的Array
中獲取this
上下文。 為了簡潔起見,我在reduce
調用中使用了=>
。
let total = 0;
for (let value of [1, 2, 3, 4]) {
total += value;
}
一小段 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)
使用reduce
let arr = [1, 2, 3, 4]; let sum = arr.reduce((v, i) => (v + i)); console.log(sum);
無需initial value
! 因為如果沒有傳遞initial value
,則不會對列表的第一個元素調用callback function
,而是將第一個元素作為initial value
傳遞。 非常 c 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]
檢查以防止無限循環。 一旦到達最后一項,它就會返回整個總和。
對數組進行排序並從最小數字開始求和(片段顯示與非排序的差異)
[...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); // we use .sort((a,b)=>ab) instead .sort() because // that second one treat elements like strings (so in wrong way) // eg [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); console.log(sum); // 60
這些確實是很好的答案,但是以防萬一數字按問題(1,2,3,4)中的順序排列,您可以通過應用公式 (n*(n+1))/2 輕松做到這一點,其中n 是最后一個數字
您可以將 reduce() 方法與 lambda 表達式結合使用:
[1, 2, 3, 4].reduce((accumulator, currentValue) => accumulator + currentValue);
使用減少()
[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
我看到所有答案都是“減少”解決方案
var array = [1,2,3,4]
var total = 0
for (var i = 0; i < array.length; i++) {
total += array[i]
}
console.log(total)
很簡單
第 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);
了解底層過程的最簡單答案:
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)
這里很酷的技巧,我有很多安全的傳統答案沒有緩存數組的長度。
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)
帶 ES6 剩余參數
let array = [1, 2, 3, 4] function sum(...numbers) { let total = 0; for (const number of numbers) { total += number; } return total; } console.log(sum(...array));
一個簡單的方法示例:
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]));
當數組由字符串組成時,必須更改代碼。 如果數組是來自數據庫請求的結果,則可能是這種情況。 此代碼有效:
alert(
["1", "2", "3", "4"].reduce((a, b) => Number(a) + Number(b), 0)
);
這里,["1", "2", "3", "4"] 是字符串數組,函數Number()
將字符串轉換為數字。
是否有理由不首先過濾數組以刪除非數字? 看起來很簡單:
[1, 2, 3, null, 'a'].filter((x) => !isNaN(x)).reduce((a, b) => a + b)
getTotal = (arr) => {
let total = 0
for (let i = 0; i < arr.length; i++) {
total += arr[i];
}
return total
}
getTotal([1, 2, 3, 4]) // 10
getTotal([1, 2, 3, 4, 5]) // 15
您可以使用 for of 循環獲取總和,如下所示:
let arr = [1, 2, 3, 4];
let total = 0;
for (let i of arr) {
total += i;
}
console.log(total)
嘗試這個...
function arrSum(arr){
total = 0;
arr.forEach(function(key){
total = total + key;
});
return total;
}
Vanilla JavaScript 就是你所需要的:
> a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; a.forEach(function(e){sum += e}); sum
10
> a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; a.forEach(e => sum += e); sum
10
> a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; for(e in a) sum += e; sum
"00123foobar"
> a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; for(e of a) sum += e; sum
10
這個函數可以總結所有的數字——
function array(arr){
var sum = 0;
for (var i = 0; i< arr.length; i++){
sum += arr[i];
}
console.log(sum);
}
array([5, 1, 3, 3])
考慮到你有數組
const arr = [1, 2, 3, 4];
對我來說,最直觀的方法是使用 for-in
let sum = 0;
for(var value in arr) {
sum += arr[value];
}
console.log('Array:', arr);
console.log('Sum:', sum);
然而,您也可以使用箭頭函數和 reduce 函數
const sum = arr.reduce(function (a, b) {
return a + b;
}, 0);
console.log('Array:', arr);
console.log('Sum:', sum);
他們都會輸出
Array: [ 1, 2, 3, 4]
Sum: 10
我認為這是找到數字總和數組的簡單方法
function sumArray(arr){
let total = 0;
for(i = 0; i<arr.length ; i++){
total += arr[i];
}
return total;
}
console.log(sumArray([1,2,3,4,]));
只需使用此功能:
function sum(pArray)
{
pArray = pArray.reduce(function (a, b) {
return a + b;
}, 0);
return pArray;
}
function sum(pArray) { pArray = pArray.reduce(function (a, b) { return a + b; }, 0); return pArray; } var arr = [1, 4, 5]; console.log(sum(arr));
一個“重復”問題詢問如何對二維數組執行此操作,因此這是回答該問題的簡單改編。 (區別僅在於六個字符[2], 0
,它在每個子數組中查找第三項並傳遞初始值零):
const twoDimensionalArray = [ [10, 10, 1], [10, 10, 2], [10, 10, 3], ]; const sum = twoDimensionalArray.reduce( (partial_sum, a) => partial_sum + a[2], 0 ) ; console.log(sum); // 6
你可以試試這個:
var arr = [100,114,250,1200];
var total = 0;
for(var i in arr){
total += parseInt(arr[i]);
}
console.log(total);
輸出將是:1664
或者如果 value 是 Float,那么試試這個:
var arr = [100.00,114.50,250.75,1200.00];
var total = 0;
for(var i in arr){
total += parseFloat(arr[i]);
}
console.log(total.toFixed(2));
輸出將是:1665.25
我知道這是一個舊帖子。 但我只是想分享我解決這個問題的方法。
let myArr = [1, 3, 4, 5, 6, 7, 8];
let counter = 0;
for(let i = 0; i < myArr.length; i++){
counter = counter + myArr[i];
console.log(counter);}
//Try this way
const arr = [10,10,20,60];
const sumOfArr = (a) =>{
let sum=0;
for(let i in a) {
sum += a[i];
}
return sum;
}
console.log(sumOfArr(arr))
事實是有一個古老而有趣的經典解決方案(除了新手'foreach'和'reduce'):經典for of 。
y = 0;
for (x of [1, 2, 3, 4]) y+=x;
如果您關心性能,請定義一個使用for
循環的 function。
function sum(arr) {
var res = 0;
for (var x of arr) {
res += x;
}
return res;
}
我使用benchmark.js
(打字稿版本)對一系列實現進行了基准測試:
const arr = Array.from({ length: 100 }, () => Math.random());
const reducer = function (p: number, a: number) {
return p + a;
};
const recursion = function (arr: number[], i: number) {
if(i > 0) return arr[i] + recursion(arr, i - 1)
else return 0
};
const recursion2 = function (arr: number[], i: number, len: number) {
if(i < len) return arr[i] + recursion2(arr, i + 1, len)
else return 0
};
const recursion3 = function (arr: number[], i: number) {
if(i < arr.length) return arr[i] + recursion3(arr, i + 1)
else return 0
};
new Benchmark.Suite()
.add("jquery", () => {
let res = 0;
$.each(arr, (_, x) => (res += x));
})
.add("lodash", ()=>_.sum(arr))
.add("forEach", () => {
let res = 0;
arr.forEach((x) => (res += x));
})
.add("reduce", () => arr.reduce((p, a) => p + a, 0))
.add("predefined reduce", () => arr.reduce(reducer, 0))
.add("eval", () => eval(arr.join("+")))
.add("recursion", () => recursion(arr, arr.length - 1))
.add("recursion2", () => recursion2(arr, 0, arr.length))
.add("recursion3", () => recursion3(arr, 0))
.add("naive", () => (
arr[0]+arr[1]+arr[2]+arr[3]+arr[4]+arr[5]+arr[6]+arr[7]+arr[8]+arr[9]+
arr[10]+arr[11]+arr[12]+arr[13]+arr[14]+arr[15]+arr[16]+arr[17]+arr[18]+arr[19]+
arr[20]+arr[21]+arr[22]+arr[23]+arr[24]+arr[25]+arr[26]+arr[27]+arr[28]+arr[29]+
arr[30]+arr[31]+arr[32]+arr[33]+arr[34]+arr[35]+arr[36]+arr[37]+arr[38]+arr[39]+
arr[40]+arr[41]+arr[42]+arr[43]+arr[44]+arr[45]+arr[46]+arr[47]+arr[48]+arr[49]+
arr[50]+arr[51]+arr[52]+arr[53]+arr[54]+arr[55]+arr[56]+arr[57]+arr[58]+arr[59]+
arr[60]+arr[61]+arr[62]+arr[63]+arr[64]+arr[65]+arr[66]+arr[67]+arr[68]+arr[69]+
arr[70]+arr[71]+arr[72]+arr[73]+arr[74]+arr[75]+arr[76]+arr[77]+arr[78]+arr[79]+
arr[80]+arr[81]+arr[82]+arr[83]+arr[84]+arr[85]+arr[86]+arr[87]+arr[88]+arr[89]+
arr[90]+arr[91]+arr[92]+arr[93]+arr[94]+arr[95]+arr[96]+arr[97]+arr[98]+arr[99]))
.add("loop with iterator", () => {
let res = 0;
for (const x of arr) res += x;
})
.add("traditional for loop", () => {
let res = 0;
// cache the length in case the browser can't do it automatically
const len = arr.length;
for (let i = 0; i < len; i++) res += arr[i];
})
.add("while loop", () => {
let res = 0;
let i = arr.length;
while (i--) res += arr[i];
})
.add("loop in a function ", () => sum(arr))
.on("cycle", (event) => console.log(String(event.target)))
.run();
在 chrome 104 中,基於for
循環的實現是最快的:
jquery x 1,832,472 ops/sec ±1.35% (61 runs sampled)
lodash x 2,079,009 ops/sec ±1.11% (68 runs sampled)
forEach x 4,887,484 ops/sec ±2.35% (67 runs sampled)
reduce x 21,762,391 ops/sec ±0.46% (69 runs sampled)
predefined reduce x 2,026,411 ops/sec ±0.50% (68 runs sampled)
eval x 33,381 ops/sec ±2.54% (66 runs sampled)
recursion x 2,252,353 ops/sec ±2.13% (62 runs sampled)
recursion2 x 2,301,516 ops/sec ±1.15% (65 runs sampled)
recursion3 x 2,395,563 ops/sec ±1.65% (66 runs sampled)
naive x 31,244,240 ops/sec ±0.76% (66 runs sampled)
loop with iterator x 29,554,762 ops/sec ±1.07% (66 runs sampled)
traditional for loop x 30,052,685 ops/sec ±0.67% (66 runs sampled)
while loop x 18,624,045 ops/sec ±0.17% (69 runs sampled)
loop in a function x 29,437,954 ops/sec ±0.54% (66 runs sampled)
Firefox 104 表現出類似的行為:
jquery x 1,461,578 ops/sec ±1.58% (64 runs sampled)
lodash x 4,931,619 ops/sec ±0.80% (66 runs sampled)
forEach x 5,594,013 ops/sec ±0.51% (68 runs sampled)
reduce x 3,731,232 ops/sec ±0.53% (66 runs sampled)
predefined reduce x 2,633,652 ops/sec ±0.54% (66 runs sampled)
eval x 105,003 ops/sec ±0.88% (66 runs sampled)
recursion x 1,194,551 ops/sec ±0.24% (67 runs sampled)
recursion2 x 1,186,138 ops/sec ±0.20% (68 runs sampled)
recursion3 x 1,191,921 ops/sec ±0.24% (68 runs sampled)
naive x 21,610,416 ops/sec ±0.66% (66 runs sampled)
loop with iterator x 15,311,298 ops/sec ±0.43% (67 runs sampled)
traditional for loop x 15,406,772 ops/sec ±0.59% (67 runs sampled)
while loop x 11,513,234 ops/sec ±0.60% (67 runs sampled)
loop in a function x 15,417,944 ops/sec ±0.32% (68 runs sampled)
定義匿名 function 的實現通常較慢,因為創建匿名 function 的開銷很大。 當使用大型數組運行基准測試時,例如長度為 1000 而不是 100, reduce
和基於for
循環的實現之間的差異在 chrome 中變得微不足道。
Chrome 的 V8 引擎知道如何在reduce
中內聯簡單的匿名函數,因為reduce
測試用例比predefined reduce
測試用例快得多。 Firefox 似乎嘗試了類似的方法,但這樣做效率較低。 非內聯 function 調用在 js 中非常慢,因為調用堆棧的效率低於編譯軟件中的調用堆棧。
與reduce
類似,基於forEach
和jquery
的實現使用匿名函數並且相對較慢。 lodash
有一個專門的sum
實現,但它(從 v4.0.0 開始)被實現為sumBy
的一個特例,效率相對較低。
eval
是迄今為止最慢的測試用例。 這是有道理的,因為使用連接構造字符串可能會導致幾個動態分配(速度很慢)。 接下來,必須調用解析器,然后才能最終執行代碼。
我已經包含了一些遞歸實現,因為互聯網上的一些人聲稱遞歸比 js 中的循環更快。 我無法重現他們的示例-使用benchmark.js
,遞歸非常慢,並且當使用帶有循環的console.time
時,兩個函數都需要相同的時間。 在計算總和時,正如預期的那樣,遞歸比循環慢得多,這可能是由於 js 調用堆棧的大量使用。
天真的實現將手動添加數組的所有 100 個元素。 雖然很不方便,但這是最快的實現。 但是,幸運的是, for
循環非常接近。 在循環周圍添加單個 function 調用不會損害性能。 因此,您可以從上面隨意使用實用程序 function。
我無法解釋為什么while
循環比for
循環慢。 反向迭代數組似乎不是這里的問題。
有人也可以使用map()
函數對數組值求和。
function sumOfArrVal(arr){
let sum=0;
arr.map(val=>sum+=val)
return sum
}
let result=sumOfArrVal([1,2,3,4])
console.log(result)
沒有人提到函數式編程,但在這種情況下使用 Ramda 將是一種非常干凈的方法:
//Assuming you use nodejs, but can also be used in browser
const R = require('ramda');
let nums = [2, 4, 6, 8, 10];
console.log(R.sum(nums));
我看到這是一個老問題,但實際上幾乎沒有任何答案使用 jQuery,特別是提問者要求的$.each
。 有一種方法可以做到這一點,但是許多人建議的本機方法(即使用Array.reduce()
)更好更容易。
如果您絕對必須使用它,這是 jQuery 方式:
var arr = [1,2,3,4];
var sum = 0;
$.each( arr, (i, v) => sum += v);
alert(sum); // This will be 10
使用遞歸
var sum = (arr) => arr.length === 1 ? arr[0] : arr.shift() + sum(arr);
sum([1,2,3,4]) // 10
此外,使用es6
求和以獲得簡單array
。
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);
<!DOCTYPE html>
<html>
<body>
<p>Click the button to join two arrays.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
var hege = [1, 2,4,6,7,8,8];
var stale = [1, 2,4,5];
function myFunction() {
console.log((hege.length > stale.length))
var children = (hege.length > stale.length)? abc1() :abc2(); document.getElementById("demo").innerHTML = children;
}
function abc1(){
console.log(hege,"Abc1")
var abcd=hege.map(function (num, idx) {
console.log(hege.length , idx)
return stale.length>idx?num + stale[idx]:num;
})
return abcd;
}
function abc2(){
console.log(hege,"Abc2",stale)
var abcd=stale.map(function (num, idx) {
console.log(hege.length , idx)
return hege.length>idx?num + hege[idx]:num;
})
return abcd;
}
</script>
</body>
</html>
使用map
:
var sum = 0;
arr.map(function(item){
sum += item;
});
// sum now contains the total.
您可能會將該方法添加到 Array 原型中。
Array.prototype.sum = function(){
var sum = 0;
this.map(function(item){
sum += item;
});
return sum;
}
然后你可以像這樣在任何數組上使用它:
arr.sum();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.