2016-06-11 55 views
0

在下面的代碼中,matrix.length只計算第一個數組,而不是第二個數組。我如何計算多維數組,以便下面的代碼的結果是10?如何檢測javascript中的多維數組長度?

var matrix = [1,2,3,4,5,6, [1,2,3,4]]; 

console.log(matrix.length - 1) 
+0

您正在尋找的預期價值是什麼? – Mikey

+0

你想要10個? – vaso123

+2

目前還不清楚你在問什麼。請在所描述的案例中包含預期結果,並且一般性地描述問題(這種情況非常具體)。 – hon2a

回答

11

沒有捷徑,你必須總結數組的長度。如果你只有兩個維度,那麼:

var matrix = [1,2,3,4,5,6, [1,2,3,4]]; 
 
var sum = matrix.reduce(function(acc, entry) { 
 
    return acc + (Array.isArray(entry) ? entry.length : 1); 
 
}, 0); 
 
console.log(sum);

如果你可以有更多的維度,你需要遞歸。由於斜視在評論中指出,作出上述遞歸僅僅是一個只用array.length給予我們reduce回調的名稱,然後做reduce再次,而不是事:

var matrix = [1,2,3,4,5,6, [1,2,[3,4]]]; 
 
var sum = matrix.reduce(function callback(acc, entry) { 
 
    return acc + (Array.isArray(entry) ? entry.reduce(callback, 0) : 1); 
 
}, 0); 
 
console.log(sum);


一些說明:

  • Array.isArrayArray#reduce分別爲添加到ES5(2009年),所以應該可以在幾乎任何現代瀏覽器(所以,不是IE8);它們都可以在舊版瀏覽器上被填充/填充。
  • JavaScript實際上並沒有多維數組。它有數組的數組。
  • 上面的遞歸示例使用名爲的構造,命名函數表達callback。 NFE的名字很糟糕,因爲幾年前瀏覽器以幾種不同的方式讓他們錯誤,但現在他們很好。 (如果你使用上面的IE8   —包括polyfills它缺少  —的東西,甚至會工作,即使IE8 gets NFEs wrong。)
+2

只需一些額外的字符就可以遞歸...'entry.length'變成'entry.reduce(fn,0)'*(和'fn'爲回調名稱)*。不妨全力以赴! – 2016-06-11 12:32:17

+1

@NinaScholz:我的頭在哪裏? :-) 謝謝。 –

+1

@squint:好的!完成。 –

1

大廈@ T.J克羅德與reduce的解決方案,我會建議扭轉一點點,所以在代碼中只有一個提到reduce。和香料它,這是箭頭語法:

function entries(a) { 
 
    return Array.isArray(a) ? a.reduce((acc, el) => acc + entries(el), 0) : 1; 
 
} 
 

 
var matrix = [1,2,3,4,5,6, [1,2, [3,4]]]; 
 

 
console.log(entries(matrix));

這樣,它甚至會針對非數組參數的工作:返回值,在這種情況下爲1。顯然不那麼重要。