2017-05-17 4 views
-2

配列[1,2,3、[4,5,6、 [7,8,9]、10,11,12]、13,14,15]配列と数値で構成される配列の和を求めるにはどうすればいいですか?

+0

[so]へようこそ!このサイトでは、自分でコードを書くことができます**。 ** [もっと研究をして](// meta.stackoverflow.com/questions/261592)**あなたが問題を抱えていると、あなたが試みたものを投稿することができます** (** stackoverflow.com/help/mcve)を提供しています。私は良い質問と[完璧な質問]を読むことをお勧めします(http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)。また、[ツアー]を取って** [this](// meta.stackoverflow.com/questions/347937/)**を必ず読んでください。 – Badacadabra

+0

1つのアイデア:[配列を平坦化する](http://stackoverflow.com/q/10865025/218196)、次に[合計](http://stackoverflow.com/q/1230233/218196)。問題をより小さな問題に分割し、それらの解決策を見出す(両方のサブ問題が前にSOに質問されている)。 –

答えて

0

reduce()を再帰で使用すると、配列内のすべての数値の合計を得ることができます。

var arr = [1, 2, 3, [4, 5, 6, [7, 8, 9], 10, 11, 12], 13, 14, 15]; 
 

 
function sum(data) { 
 
    return data.reduce(function(r, e) { 
 
    return r += !Array.isArray(e) ? e : sum(e) 
 
    }, 0) 
 
} 
 

 
console.log(sum(arr))

0

あなたは、配列をフラット化して、あなたは通常の配列と同じようにすべての要素を合計することができます。

DEMO(ES6構文)

let arr = [1,2,3,[4,5,6,[7,8,9],10,11,12],13,14,15]; 
 

 
function flatten(arr) { 
 
    const flat = [].concat(...arr); 
 
    return flat.some(Array.isArray) ? flatten(flat) : flat; 
 
} 
 

 
//Flatten array, and sum elements 
 
let result = flatten(arr).reduce((a,b) => a + b, 0); 
 

 
console.log(result);

免責事項:合計を見つけるために、How to flatten nested array in javascript?

1

迅速かつ汚い再帰関数:から取らflatten

let array = [1,2,3,[4,5,6,[7,8,9],10,11,12],13,14,15] 
 
let sum = 0; 
 

 
function incrementSum(inputArray) { 
 
    inputArray.forEach(el => { 
 
    if (el.length) { 
 
     incrementSum(el); 
 
    } 
 
    else { 
 
     sum += el; 
 
    } 
 
    }); 
 
} 
 

 
incrementSum(array); 
 

 
console.log(sum);

0

単純な再帰ソリューション:

function isObject(v){ return typeof v === "object" && Boolean(v) } 
 
function plus(a,b){ return a+b } 
 
function sum(v){ 
 
\t //deal with Arrays 
 
\t return Array.isArray(v)? v.map(sum).reduce(plus, 0): 
 
\t \t //iterators and ArrayLike Objects 
 
\t \t isObject(v) && isNaN(+v)? Array.from(v, sum).reduce(plus, 0): 
 
\t \t //parse everything else into a number 
 
\t \t +v || 0; 
 
} 
 

 
var arr = [1,2,3,[4,5,6,[7,8,9],10,11,12],13,14,15]; 
 
console.log(sum(arr));

が、何の制限を持たない発電機に注意してください。

.map(sum)部分は、サブアレイのようなネストされた構造を扱い、すべてを数字に変換します。を数字に変換します。数字の数値は0に変換されます。
.reduce(plus, 0)の部分が実際に追加されます。

isObject(v) && isNaN(+v)の部分は、NumberクラスのインスタンスまたはvalueOfインターフェイスを実装し、数値を返すオブジェクトのように、このオブジェクトを数値に変換しようとします。それが失敗した場合に限り、オブジェクトは反復子(Symbol.iteratorを実装する場合)またはArrayLikeオブジェクトとして扱われるかのいずれかと解釈されます。

関連する問題