数値の配列の合計を見つける方法


809

配列が与えられた場合、[1, 2, 3, 4]その要素の合計をどのように見つけることができますか?(この場合、合計はになります10。)

$.each便利かもしれないと思ったのですが、どう実装したらいいかわかりません。



18
@tereškoGoogleへの不本意は、Stackoverflowの正当な理由ではありません。質問が(再)よく検索されていないと思われる場合は、反対票を投じてください。(また、回答から判断すると、これは非常に物議を醸すトピックのようであり、非常に賛成の悪い慣行(評価)を含む多くの解決策があり、驚くべきことです。)
Trilarion

8
注:ここでのほとんどの答えは基本的に計算a[0] + a[1] + ...であり、配列に数値以外の要素がある場合、これは文字列の連結に変わる可能性があります。例えば['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
Beni Cherniavsky-Paskin、2016年

Array.reduceにフィードできる組み込みのレデューサーはありませんか?のようなものを考えてい[1,2,3].reduce(Math.sum)ます。
Phil

回答:


545

推奨(デフォルト値で減らす)

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

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

もちろん、アラートを表示することは、起こり得る最悪の事態ではありません。私がこれを含めた唯一の理由は、それが明確にされたとは思わないので、オルトンの質問への回答としてです。


8
このマジックreduce()for()、長い年月を経ても、単純なインデックス付きループよりも25〜30%遅いことを知っていますか?jsperf.com/reduce-vs-loop/4
tevemadar

ちなみに数値が「0」の場合、問題が発生します-何らかの理由で文字列として解釈される可能性があります。1 * a + 1 * bを追加するとうまくいきました。速度に関しては、これは簡単に書くことができ、速度は気にしません
Peter Kay

1179

Lispのために正確に仕事することthis'd 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

28
我々はすべての利用のES2015と仮定すると、以前よりすっきりし、それを行うことができます[1, 2, 3].reduce((a,b)=>a+b)
デニス・Séguret

1
関数(a、b)を使用したreduceの実行時間は、手動の反復と合計に匹敵するのか、またはかなりのオーバーヘッドが含まれているのだろうか?
Trilarion

1
私はそれが答えは実際にあなたがリンクされたページ上で見つけることができることを言及する価値があると信じています:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
アレックス・コーン

2
私は配列へのメソッドのカップルを追加します。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; }
pilat

2
@Black配列を単一の値に減らします。
Florian Margaine

205

なぜ削減しないのですか?通常は少し直観的ですが、合計を見つけるために使用するのは非常に簡単です。

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

3
IE8はそれをサポートしておらず、jQueryがそれを追加しようとしているようには見えません。しかし、プロトタイプはそれを持っています。
Ishmael Smyrnow

4
@ Ishmael、UnderscoreJSを使用できます。これは、可能な場合はブラウザーの実装にフォールバックするか、そうでない場合は独自に実装します。
Pablo Diaz

3
直感とは何reduce()ですか?
キヤノン

3
@ s4nji Array.prototype.reduce() 、配列を単一の戻り値に減らします。
正午

6
@ s4nji ...ソースを減らしている場合を除いて-その場合、それをその本質的なもの、つまり、オーバーヘッドのないすべてのフレーバーの合計にまで煮詰めます。:-)
CB Du Rietz 2016

97
var arr = [1,2,3,4];
var total=0;
for(var i in arr) { total += arr[i]; }

3
これは、上記のjQuery.each()ソリューションよりもはるかに高速です。
Angry Dan

41
@Sprog:ただし、使用(var i=0; i<arr.length; i++)はさらに高速です。var sum=0; var i=arr.length; while(i--) sum += arr[i]それでも、使用はさらに速くなります。
2012年

14
for... in配列でループを使用すると、この場合は_偶然に_機能し、配列はオブジェクトを拡張するためです。Rikingのソリューションはより優れています
Benjamin Gruenbaum 2013年

2
@BenjaminGruenbaumは、配列のプロトタイプに列挙可能なプロパティが何も追加されていないことを条件にしています...
canon

1
@YSCいいえ、ありません。for...inJavaScript のループはインデックスを取得します。これは、値を取得することを期待するコーダーにとって一般的な障害です。(for(var i in [1,2,3]) { console.log(i); }コンソールでお試しください)
2016年

61
var total = 0;
$.each(arr,function() {
    total += this;
});

87
どうぞ、reduce以下の答えを使用してください。あなたが持っていないときは、可変変数を宣言しないでください。
Bruno


11
これは「受け入れられた答え」ですが、これを使用しないでください。以下のフロリアンの答えははるかに優れています!
アンディシンクレア

12
@BrunoGrieder「必要がない場合は可変変数を宣言しないでください」は命令型言語について非常に偏見のある意見であり、想像力の広がりによってコードの匂いがすることはほとんどありません。タイラーの答えに間違いはなく、タイラーとフローリアンの違いはスタイルだけです。
ロブ

5
OPから:$ .eachは便利かもしれないと思いましたが、それを実装する方法がわかりません。これは最善ではないかもしれませんが、OPの要求に答えます。


29

これは、すべてのアイテムをループし、各反復でそれらを- 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;
}

12
巧妙ではありますがsum、ループの外側で宣言するコードの方がはるかに読みやすくなっています。
Beni Cherniavsky-Paskin

@ BeniCherniavsky-Paskinええ、ここも同じです...なぜ私がなぜこのようにその日にそれをしたのか分かりません...しかし、私はそのままにしましょう!これは、私たちがどのようにできるかの例にすぎません... ;)
yckart

ES6以来、JavascriptをとノウハウのブロックスコープをDOES constlet。したがってsumforループの外側をとして宣言できますlet sum = 0;。ループの前に配列の長さを次のようにキャッシュすることもできますconst length = array.length;
KSK

23
arr.reduce(function (a, b) {
    return a + b;
});

リファレンス:Array.prototype.reduce()


6
場合、これは失敗しますarrです[]

7
:そうのように、デフォルト値を追加しますarr.reduce(function (a, b) { return a + b; }, 0);
NGZ

15
// 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、++ )ループ。

方法論のメモ:このテストはGoogle Apps Scriptサーバーで実行されたため、JavaScriptエンジンはChromeとほとんど同じです。

編集:実行ごとに0.12ミリ秒--ii--節約する代わりに(i--は1.7)

編集:神聖な虚辞、この投稿全体を気にしないでください。上記のreduce()メソッドを使用してください。これは1実行あたり1ミリ秒です。


1
あなたが使ったタイミングが大好きです。あなたの答えは、「私を選んでください、私は最高です!」と言うだけではありません。代わりに理由を示しています。とにかく、while (--i) do_something他のことでもうまくいくかもしれません。
Redwolfプログラム

var sum = arr[0]
noobninja

12

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


JavaScriptループへの最適化(つまり、長さのデクリメント)を基になるアセンブリに適用して、実行速度を上げることができるため、Chromeでは高速になるはずです。
ジャックギフィン2017年

12

私のような機能的なワンライナーを探している人はいますか?これを取る:

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

あなたは第二のparamとして削減のための初期値を追加することができますarr.reduce(function(a, b) { return a + b;}, 0);
NGZ

ありがとう!それを組み込みます。
geek-merlin

12

面白いアプローチ:

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

5
このコードで何が起こっているのかを説明して、この答えを詳しく説明していただけませんか?なぜ機能するのですか?それは正確に何をしますか?これらは、回答の質を向上させるのに役立ちます。
Ortund、2016年

@ user40521はすでに私が思うようにこれに答えています。見なかった。
電子

これは短くて甘いですし、確かに興味深いですが、非常に非効率的です。reduceすべてではないにしても、大多数のケースで使用することは間違いなく好ましいです。
Ninjakannon、2018年

Errm、[1,"2;YourProgram.ripToShreds();3",4]
プログラム

だから私は間違った答えをNaNしようとしeval(['alert("removing your computer")',2,3].join("+"))たときに得ています0/10
pie6k

12

次の配列があるとします。

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

このようなものを配列にプロトタイプすることはお勧めしません...


10

標準の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になるはずです)。この種のソリューションに隠れた欠点がないことを願っています。


1
また、CやJavaのプログラマであれば、これを理解することができます。
Audrius Meskauskas

すべての値を合計するという単純な目的のために、単純な単純な古いforループには、実行時間の点でライバルはありません
fedeghe

唯一の問題は、20のforループがすべて互いに入れ子になっていると少し面倒です
Redwolfプログラム

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

そうすれば、あらゆる種類のエキゾチックなものを配列に入れることができます。

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

私は冗談半分だ。


26
私は半分笑っています
caub 2016

eval(['alert("removing your computer")',2,3].join("+"))
pie6k

7

私はJavaScriptとコーディング一般の初心者ですが、配列内の数値を合計する簡単で簡単な方法は次のようであることがわかりました。

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

基本的に、組み込み関数を使用しないソリューションはあまり見られず、この方法は簡単に記述および理解できるため、これを提供したいと考えました。


1
これは、この2012年の回答またはこの2014 年の回答とどう違うのですか?あなたが見たことがない2つの解決策があります。
Dan Dascalescu 2017

5

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)

5

数人がに.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


5

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

4

する必要はありませんinitial valueinitial 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

4

スタックアルゴリズムを使用したエレガントなワンライナーソリューションを次に示します。ただし、この実装の美しさを理解するには少し時間がかかるかもしれません。

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

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

基本的に、関数は配列を受け入れ、配列に正確に1つの項目が含まれているかどうかをチェックします。falseの場合、スタックから最後の項目をポップし、更新された配列を返します。

このスニペットの優れた点は、関数にarr[0]無限ループを防ぐためのチェックが含まれていることです。最後の項目に到達すると、合計全体を返します。


4

reduce()メソッドをラムダ式と組み合わせることができます:

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


3

私はすべての答えが「還元」ソリューションに行くのを見ました

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

3

正確さ

配列をソートし、最小数のフォームから合計を開始します(スニペットは、非ソートとの違いを示します)

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

数値の多次元配列の場合 arr.flat(Infinity)


2

ここでクールなトリック、私は配列の長さをキャッシュしない安全な伝統的な答えの多くを備えたほんの少しのピックを持っています。

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

これは私には行き詰まっている時代遅れの考え方である可能性がありますが、このコンテキストで使用することに不利な点はありません。


長さをキャッシュする問題は、赤ニシンです。JSエンジンは点滅することなくこれを最適化します。

2

それらは本当に素晴らしい答えですが、質問が(1,2,3,4)のように順番に並んでいる場合に備えて、式(n *(n + 1))/ 2を適用することで簡単に行うことができます。 nは最後の数です


2
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

このコードはオペレーティングシステムを削除しますか?それともあなたの個人情報を私に送信しますか?

2

これははるかに簡単です

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

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

console.log(sum)

2

簡単なメソッドの例:

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]));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.