在下面的代碼中,matrix.length只計算第一個數組,而不是第二個數組。我如何計算多維數組,以便下面的代碼的結果是10?如何檢測javascript中的多維數組長度?
var matrix = [1,2,3,4,5,6, [1,2,3,4]];
console.log(matrix.length - 1)
在下面的代碼中,matrix.length只計算第一個數組,而不是第二個數組。我如何計算多維數組,以便下面的代碼的結果是10?如何檢測javascript中的多維數組長度?
var matrix = [1,2,3,4,5,6, [1,2,3,4]];
console.log(matrix.length - 1)
沒有捷徑,你必須總結數組的長度。如果你只有兩個維度,那麼:
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.isArray
和Array#reduce
分別爲添加到ES5(2009年),所以應該可以在幾乎任何現代瀏覽器(所以,不是IE8);它們都可以在舊版瀏覽器上被填充/填充。callback
。 NFE的名字很糟糕,因爲幾年前瀏覽器以幾種不同的方式讓他們錯誤,但現在他們很好。 (如果你使用上面的IE8 —包括polyfills它缺少 —的東西,甚至它會工作,即使IE8 gets NFEs wrong。)只需一些額外的字符就可以遞歸...'entry.length'變成'entry.reduce(fn,0)'*(和'fn'爲回調名稱)*。不妨全力以赴! – 2016-06-11 12:32:17
@NinaScholz:我的頭在哪裏? :-) 謝謝。 –
@squint:好的!完成。 –
大廈@ 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。顯然不那麼重要。
您正在尋找的預期價值是什麼? – Mikey
你想要10個? – vaso123
目前還不清楚你在問什麼。請在所描述的案例中包含預期結果,並且一般性地描述問題(這種情況非常具體)。 – hon2a