配列[1, 2, 3, 4]
が与えられたとき、どうすればその要素の合計を見つけることができますか? (この場合、合計は10
になります。)
$.each
が役に立つかもしれないと思ったが、それを実装する方法がわからない。
_ 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
なぜ減らさないのですか?それは通常少し直感的にわかりにくいですが、合計を見つけるためにそれを使用することはかなり簡単です:
var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);
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))
)
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の質問に対する答えとしてです。
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;
});
これは、すべての項目をループ処理し、各反復でそれらを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;
}
もしあなたがLodashを使っているのなら、 sum 関数を使うことができます。
array = [1, 2, 3, 4];
sum = _.sum(array); // sum == 10
arr.reduce(function (a, b) {
return a + b;
});
// 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ミリ秒です。
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
このようなものを配列にプロトタイプすることはお勧めできません...
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
私のような機能的なワンライナーを探している人はいますか?これを取る:
sum= arr.reduce(function (a, b) {return a + b;}, 0);
面白いアプローチ:
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になるはずです)。私はこの種の解決策に隠れた欠点がないことを願っています。
var totally = eval(arr.join('+'))
そうすれば、あらゆる種類のエキゾチックなものを配列に入れることができます。
var arr = ['(1/3)','Date.now()','foo','bar()',1,2,3,4]
冗談です。
私はJavaScriptとコーディング全般の初心者ですが、配列内の数字を合計する簡単で簡単な方法は次のようなものであることがわかりました。
var myNumbers = [1,2,3,4,5]
var total = 0;
for(i=0; i<myArray.length; i++){
total += myArray[i];
}
基本的に、私は組み込み関数を使用しない多くの解決策を見たことがないのでこれを貢献したいと思いました、そしてこの方法は書くことと理解するのが簡単です。
少数の人々が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
呼び出し内では、簡潔にするために=>
を使用しました。
短い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)
この実装の美しさを理解するには少し時間がかかるかもしれませんが、これは スタックアルゴリズム を使用するエレガントなワンライナーソリューションです。
const getSum = arr => (arr.length === 1) ? arr[0] : arr.pop() + getSum(arr);
getSum([1, 2, 3, 4, 5]) //15
基本的に、この関数は配列を受け取り、その配列に正確に1つの項目が含まれているかどうかを確認します。 falseの場合、最後の項目をスタックからポップして更新された配列を返します。
このスニペットの長所は、この関数に無限ループを防ぐためのarr[0]
チェックが含まれていることです。最後の項目に達すると、合計を返します。
ラムダ式とreduce()メソッドを組み合わせることができます。
[1, 2, 3, 4].reduce((accumulator, currentValue) => accumulator + currentValue);
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 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
私はすべての答えが「リデュース」ソリューションに向かっているのを見ました
var array = [1,2,3,4]
var total = 0
for (var i = 0; i < array.length; i++) {
total += array[i]
}
console.log(total)
ここでクールなトリック、私は配列の長さをキャッシュしないで安全な伝統的な答えの多くで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
これは私に行き詰まった時代遅れの考え方である可能性がありますが、私はこの文脈でそれを使用することに不利益を見ません。
これはずっと簡単です
function sumArray(arr) {
var total = 0;
arr.forEach(function(element){
total += element;
})
return total;
}
var sum = sumArray([1,2,3,4])
console.log(sum)
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
これらは本当に素晴らしい答えですが、問題が(1,2,3,4)のように数字が順番に並んでいる場合は、式(n *(n + 1))/ 2を適用することで簡単にできます。 nは最後の番号です
必要なのは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])
これを試して...
function arrSum(arr){
total = 0;
arr.forEach(function(key){
total = total + key;
});
return total;
}
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));
「重複する」質問が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
簡単な方法の例:
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]));
Forループを使用します。
function findSumOfElements(numbers) {
let sum = 0;
for (let i = 0; i < numbers.length - 1; i++) {
sum += numbers[i];
}
return sum;
}
この関数を使うだけです:
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));