2015-07-20 62 views
1

我想解決這個問題:編寫一個函數,將數組(第一個參數)拆分成組的大小(第二個參數)並將它們返回爲多維數組。例如:無法讀取未定義的多維數組的屬性'推'

chunk(['a', 'b', 'c', 'd'], 2) 

應該返回

[['a'. 'b'], ['c', 'd']] 

我的代碼如下:

function chunk(arr, size) { 
    var newArr = [[]]; 
    for(i = 0; i < arr.length; i++) { 
    for(j = 0; j < size; j++) { 
     newArr[i].push(arr[i + j]); 
    } 
    } 
    return newArr; 
} 

它給出了一個錯誤:無法讀取的未定義的屬性 '推'。爲什麼會發生這種情況,我該如何解決這個問題?

回答

1

你可以用嵌套循環做到這一點,但爲什麼不走了更簡單的方法,並使用array.slice()

function chunk(input, size) { 
    var output = []; 
    for(i = 0; i < input.length; i += size) { 
     output.push(input.slice(i, i + size)); 
    } 
    return output; 
} 
2

for(i = 0; i < arr.length; i++) { 

必須初始化一維數組:

newArr[i] = []; 

這將解決這個錯誤,但不會產生你想要的結果。我想你需要的東西是這樣的:

for (i = 0; i < ceil(arr.length/size); i++) { 
    newArr[i] = []; 
    for (j = 0; j < size; j++) { 
     if (i * size + j >= arr.length) 
      break; 
     newArr[i].push(arr[i * size + j]); 
    } 
} 
+0

有人可以解釋爲什麼有第5行休息嗎? – Andrew

+0

假設'size' = 3,但最初的'arr'有7個成員。最後一個「塊」將只包含1個元素 - 在此之後,將不再有成員填充最後一個塊中剩餘的2個點。這是'break'來的地方。 – Glorfindel

相關問題