2017-05-17 45 views
-2

我怎樣才能找到由數組和數字組成的數組的總和,就像這樣[1,2,3,4,5,6, [7,8,9],10,11,12],13,14,15]我如何找到由數組和數字組成的數組的總和

+0

歡迎來到[so]!在這個網站,你應該嘗試**自己編寫代碼**。後** [做更多的研究](//meta.stackoverflow.com/questions/261592)**如果你有問題,你可以**發佈你已經嘗試**與清楚的解釋是什麼是'工作**並提供[** Minimal,Complete和Verifiable示例**](// stackoverflow.com/help/mcve)。我建議閱讀[問]一個好問題和[完美問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)。另外,一定要參加[遊覽]並閱讀[this](// meta.stackoverflow.com/questions/347937/)**。 – Badacadabra

+0

一個想法:[壓扁數組](http://stackoverflow.com/q/10865025/218196),然後[求和](http://stackoverflow.com/q/1230233/218196)。將一個問題分解成更小的問題並找出解決方案(這兩個子問題之前都有問題)。 –

回答

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

免責聲明:flatten摘自:How to flatten nested array in javascript?

1

一個快速和骯髒的遞歸函數找到總:

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對象。