2013-10-03 41 views
0

我目前正在從http://toys.usvsth3m.com/javascript-under-pressure/開始一個javascript練習,我的代碼不能處理嵌套數組......我嘗試使用遞歸來解決問題,但它只是似乎是在嵌套數組情況下添加第一個元素......我來自Ruby背景,所以JavaScript對我來說有點陌生。只能在嵌套數組中找到第一個數字

如果有人可以指出我做錯了什麼,我會很感激!

感謝, 斯密

function arraySum(i) { 

// i will be an array, containing integers and/or arrays like itself. 
// Sum all the integers you find, anywhere in the nest of arrays. 
var sum = 0; 
sum = sumit(i); 

return sum; 
} 

function sumit(i) { 
var sum = 0; 
for (a=0; a<i.length; a++) 
{ 
    if (typeof(i[a]) == 'array') 
    { 
     sumit(i[a]); 
    } 
    else 
    { 
    sum += parseInt(i[a]); 
    } 
} 
return sum; 
} 
+1

當然你想要做'sum + = sumit (我[a]);'在'if語句中? –

+0

爲了讓它變得非常簡單,我會將該數組展平,然後對其進行求和。 – dandavis

回答

0

你不使用你的遞歸調用的值。試試:

if (typeof(i[a]) === 'object') 
{ 
    sum += sumit(i[a]); 
} 
+0

'typeof [] ===「object」',NOT'「array」'。 –

+0

好,我的壞。編輯糾正錯誤。 – tlrobrn

+0

現在,當給出'[「123」]'作爲輸入時,它會引起奇怪的行爲。預期的輸出是123,但實際輸出將是6. –

0

讓我們來看看你的代碼。

  • 初始化一個sum變量0
  • 調用輸入陣列上你的「助手」功能,其返回值賦給sum
    • 你的「助手」功能初始化,恰好也是另一個變量稱爲sum爲零 - 但要注意的是它不是同一個變量。爲了清楚起見,我將其稱爲sum2
    • 對於數組中的每個項目...
      • 如果是類型的數組,把這種陣列上的輔助功能,但什麼都不做有它的返回值 - 錯誤:數組返回其類型爲「對象」。
      • 否則,將其轉換爲整數,並將它添加到sum2
    • 返回sum2
  • 返回sum

看這段代碼,沒有任何理由爲什麼它不應該爲整數數組工作。但是,對於子數組,你完全捨棄了結果......如果你將它識別爲一個數組,那你就不是。相反,它也是演員。另外,單獨的函數沒有意義,因爲你在「main」函數中做的所有操作都是調用它並返回它的返回值。

嘗試這樣:

function sum(arr) { 
    function recurse(total,curr) { 
     if(curr.constructor === Array) return total+sum(curr); 
     return total+parseInt(curr,10); 
    } 
    if(arr.reduce) return arr.reduce(recurse,0); 
    // fallback for older browsers that don't support "reduce" 
    for(var i=0, l=arr.length, total=0; i<l; i++) total = recurse(total,curr); 
    return total; 
} 

替代解決方案,在舊的IE瀏覽器未經測試,但應該罰款假設reasonbly了最新的瀏覽器:

function sum(arr) { 
    arr = arr.concat.apply([],arr); // flatten the array 
    for(var i=0, l=arr.length, total=0; i<l; i++) total += parseInt(arr[i],10); 
    return total; 
} 
0

有三件事錯了。

以下是評論與解釋的修復:

function sumit(i) { 
var sum = 0; 
//You need to declare a, or else it puts it in the global scope. 
var a; 
for (a=0; a<i.length; a++) { //as a stylistic point, don't put { on a new line. 
    //check for array by seeing if it has a length property 
    if (i[a].length !== undefined) { 
     //add to sum 
     sum+= sumit(i[a]); 
    } 
    else { 
     sum += parseInt(i[a]); 
    } 
} 
return sum; 
} 

首先,當你使用for(a = 0; . . .聲明是在全球範圍內。

其次,數組的typeof檢查並不總是可行的,但所有陣列都會有。長度

第三,tlrobrn指出,需要繼續增加「和」。

注:我測試的節點該方案與這些電話

var ar = [1,1,[1,1,1,1,1],1,1,1]; 
console.log(sumit(ar)); //should print 10 

數組關於檢查: Check if object is array?

+0

從外表上看,如果我用'[1,1,{length:99999999999,taunt:「LOLUFAIL」},1,1]'調用函數會發生什麼? ;) –

+0

好的呼叫:)我同意這可能發生,只是我的第一個檢查數組 –

0

我的代碼是在我的測試更短,檢查出來

function arraySum(i) { 

var sum = 0 ; 

for (var a in i) { 
    if (typeof i[a] === 'object') { // if it is an array or object, typeof will return 'object' 
     return sum + arraySum (i[a]) ; // recursive call 
    } else if (typeof i[a] === 'number') { // if it is a number, just sum it 
     sum = sum + i[a] 
    } 
} 

return sum; 

}

相關問題