2015-05-31 47 views
0

我通過詢問我到javascript問題工作的函數:編寫分割的陣列(第一自變量)成組的尺寸(第二個參數)的長度,並返回它們作爲一個多維數組

寫功能將一個數組(第一個參數)拆分成長度爲大小的組(第二個參數)並將它們作爲多維數組返回。

例如,輸入

chunk([0, 1, 2, 3, 4, 5], 2) 

應該返回 '分塊陣列': [[0,1],[2,3],[4,5]]

我可以讓它適用於大多數例子,但是當有超過2個組塊時,它會切換順序,我不知道爲什麼。這裏是我寫的代碼:

function chunk(arr, size) { 
    var newArray = [], 
     i, temp = arr; 
    for (i = 0;i<= arr.length-size;i+=size){ 
    newArray.push(arr.slice(i,i+size)); 
    temp.splice(i,size); 
    } 
    newArray.push(temp); 
    return newArray; 
} 
chunk(['a', 'b', 'c', 'd'], 2); 

回答

7

另一個版本:

function chunk(arr, size) { 
    var result = []; 
    while (arr.length > size) { 
     result.push(arr.splice(0, size)) 
    } 
    if (arr.length) 
     result.push(arr); 

    return result; 
} 
+0

我也在處理這個問題,現在我看到了這個代碼,它可以工作,但我仍然不明白,有人可以向我解釋這個嗎?我們有size = 2,而arr.splice(0,2)只給我們['a','b'],下一步是什麼? – Valon

+0

你是什麼意思 - 下一步是什麼? –

+0

@u_mulder,我們得到這個結果:[['a','b'],['c','d']],但是while循環在末尾沒有++,允許代碼執行反覆。我很困惑。我甚至不知道如何表達我的自我。 – Valon

1

的問題是,你都是由size在每次迭代推進i和刪除i位置size元素。這會導致您跳過每個其他塊的處理。另外,您的延續條件應爲i < arr.length-size;原樣,在循環退出之後,您需要先測試一個空的temp。嘗試重寫你的循環爲:

for (i = 0; i < arr.length-size;){ 
    newArray.push(arr.slice(i,i+size)); 
    temp.splice(i,size); 
} 

由於i始終爲0,循環可以簡化爲:

while (arr.length > size) { 
    newArray.push(arr.slice(0,size)); 
    temp.splice(0,size); 
} 
+0

不會這個循環永遠跑不過,如果 '我' 不重複? – Rose

+0

@Gwen - 不,因爲每次循環時,'arr.length'都按'size'縮小。最終,'arr.length - size'將小於'i'(它總是爲0)。 (現在我想到了,因爲'i'停留在0,它可以從循環中消除,我將重寫循環來顯示它。) –

+0

很酷。謝謝,這也是有效的 – Rose

0
function chunk(arr, size) { 
    var newArr = []; 
    // x is less than or equals arr.length. 
    for(var x = 0; x <= arr.length; x++){ 
    newArr.push(arr.splice(0, size)); 
    } 

    if (arr.length){ 
    newArr.push(arr); 
    } 
    return newArr; 
} 

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

請考慮添加代碼的解釋。只有代碼是不夠的。還解釋爲什麼你的答案比接受的答案更好(如果是這樣的話) –

0
function chunk(arr, size) { 

    var arr1=[]; 
    var j=0,temp=size; 
    var len = arr.length/size; 
    for (var i=0; i<len; i++){ 
    arr1.push(arr.slice(j,size)); 
    j+=temp; 
    size+=temp; 
    } 
    return arr1; 
} 

chunk([0, 1, 2, 3, 4, 5], 2); 
+0

另一個簡單的答案。雖然它並不是執行速度最快的。只需將總陣列長度除以所需的大小即可獲得迭代的總數,因此無需使用拼接即可解決此問題! –

+0

請將您的評論轉移到答案中 –

2
function chunk(arr, size) { 
    var newArr = []; // New empty array 
    while (arr.length > 0) { // Loop thru the array items 
    newArr.push(arr.splice(0, size)); // Removes first 2 items then add it to new array 
    } 
    return newArr; // New 2D array 
} 

我嘗試在控制檯中使用這些代碼行,它工作得很好。

0

這是我的解決方案:

function chunkArrayInGroups(arr, size) { 
    var acum=[]; 
    for(i=0;i<arr.length;i=i+size) 
    { 
    var vec=arr.slice(i,size+i); 
    acum.push(vec); 
    } 

    return acum; 
} 
0

這麼多的方法...

function chunkArrayInGroups(arr, size) { 
var value = []; 

for(var i =0; i<arr.length; i += size){ 
value.push(arr.slice(i, size+i)); 
} 

return value; 
} 

chunkArrayInGroups(["a", "b", "c", "d"], 2); 
0
function chunkArrayInGroups(arr, size) { 
    var result = [], 
     iterations = Math.ceil(arr.length/size); 
    for (var i =0; i<iterations;i++){ 
     var sub = arr.splice(0, size); 
     result.push(sub); 
    } 
    return result;  
} 
0
function chunkArrayInGroups(arr, size) { 

    var temp = []; 
    var result = []; 

    for (var a = 0; a < arr.length; a++) { 
    if (a % size !== size - 1) 
     temp.push(arr[a]); 
    else { 
     temp.push(arr[a]); 
     result.push(temp); 
     temp = []; 
    } 
    } 

    if (temp.length !== 0) 
    result.push(temp); 
    return result; 
} 
相關問題