web-dev-qa-db-ja.com

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

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

$.each が役に立つかもしれないと思ったが、それを実装する方法がわからない。

592
akano1

_ 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
1139

なぜ減らさないのですか?それは通常少し直感的にわかりにくいですが、合計を見つけるためにそれを使用することはかなり簡単です:

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

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

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コードの文字列表現を実行するには eval を使用できます。 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の質問に対する答えとしてです。

167
OwChallie
var arr = [1,2,3,4];
var total=0;
for(var i in arr) { total += arr[i]; }
85
Amber
var total = 0;
$.each(arr,function() {
    total += this;
});
60
Tyler Carter

これは、すべての項目をループ処理し、各反復でそれらを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;
}
27
yckart

もしあなたがLodashを使っているのなら、 sum 関数を使うことができます。

array = [1, 2, 3, 4];
sum = _.sum(array); // sum == 10
25
David Grinberg
arr.reduce(function (a, b) {
    return a + b;
});

参照:Array.prototype.reduce()

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

上記のeval()メソッドでの3.604ms/runおよび(i、length、+の標準での2.151ms/run)と比較して、これは平均1.57ms/run(100個のランダムな正規数の配列で1000回の実行にわたって測定)になります。 +)ループします。

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

編集:--iの代わりにi--は実行毎に0.12ミリ秒節約します(i--は1.7です)

編集:神聖で洗練された、この記事全体を気にしないでください。 上記のreduce()メソッドを使用します。実行は1ミリ秒です。

13
Riking

OK、この配列があると想像してください:

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;
}

)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

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

12
Alireza

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

12
Rohit Bhalke

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

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

面白いアプローチ:

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

標準の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になるはずです)。私はこの種の解決策に隠れた欠点がないことを願っています。

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

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

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

冗談です。

5
user40521

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

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

基本的に、私は組み込み関数を使用しない多くの解決策を見たことがないのでこれを貢献したいと思いました、そしてこの方法は書くことと理解するのが簡単です。

5

少数の人々がArray.prototype.sum()メソッドを追加することを提案しました。これは一般に悪い習慣と考えられているので、私はあなたがそれをすることを提案していません。

それでもやることを主張するならば、これはそれを書くための簡潔な方法です:

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

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

プロトタイプに追加された関数は、ES5とES6の関数と矢印構文の組み合わせを使用しています。 functionは、メソッドが操作しているthisからArrayコンテキストを取得できるように宣言されています。 reduce呼び出し内では、簡潔にするために=>を使用しました。

4
Guy

短い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)
4
Timur Zhilenkov

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

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

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

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

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

4
Rex Low

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

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

reduceを使う

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

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

console.log(sum);
3
Damien Asseya

initial valueは必要ありません。 initial valueが渡されない場合、callback functionはリストの最初の要素では呼び出されず、代わりに最初の要素がinitial valueとして渡されます。非常にc _ oo _ l feature :)

[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
3
Yas

私はすべての答えが「リデュース」ソリューションに向かっているのを見ました

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

ここでクールなトリック、私は配列の長さをキャッシュしないで安全な伝統的な答えの多くでnit pickを得ました。

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

これは私に行き詰まった時代遅れの考え方である可能性がありますが、私はこの文脈でそれを使用することに不利益を見ません。

2
Brandon Brule

これはずっと簡単です

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
Jakub Gawel
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
ostranenie

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

2
Santosh

必要なのは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
1
Cees Timmerman

この機能はすべての数を合計することができます -

 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])
1
MRIDUAVA

これを試して...

function arrSum(arr){
    total = 0;  
    arr.forEach(function(key){
        total = total + key;            
    });
    return total;
}
1
Sushil

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));
0
cdavis

「重複する」質問が2次元配列に対してこれを行う方法を尋ねたので、これはその質問に答えるための単純な適応です。 (違いは、6文字の[2], 0だけです。これは、各サブアレイの3番目の項目を見つけて、ゼロの初期値を渡します)。

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
0
Cat

簡単な方法の例:

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]));
0
Sifiso Nkabinde

Forループを使用します。

function findSumOfElements(numbers) {
  let sum = 0;

  for (let i = 0; i < numbers.length - 1; i++) {
    sum += numbers[i];
  }

  return sum;
}
0
Samuel Chen

この関数を使うだけです:

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));
0
Black