2016-12-01 54 views
0

stackoverflow的第一個問題,我正在努力與這個算法。這應該是我的數組切片5像「[[0,1],[2,3],[4,5],[6,7],[8]]」但我得到的是「[[0 ,1],[2,3],[4,5] [6,7,8]」陣列算法中的分塊數組

function chunkArrayInGroups(arr, size) { 
    var newArr = []; 
    console.log(Math.floor(arr.length/size)); 
    for (i = 0; i <= (Math.floor(arr.length/size)) + 1; ++i) { 
    var cut = size; 
    newArr.push(arr.splice(0, cut)); 
    } 
    if (arr.length > 0) { 
    newArr.push(arr.splice(0, size + (arr.length - size))); 
    } 
    return newArr; 
} 
chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2); 
// expected - [[0, 1], [2, 3], [4, 5], [6, 7], [8]] 

如果您對問問題的方式任何提示,我會很高興收到任何建議!

+1

歡迎** **計算器!這可能會幫助你http://stackoverflow.com/help/how-to-ask開始如何在這裏作爲一個問題在stackoverflow。 – thebenman

+0

你的算法因爲這一行不起作用:'for(i = 0; i <=(Math.floor(arr.length/size))+ 1; ++ i){...}'witch is'for (i = 0; i <=(Math.floor(9/2))+ 1; ++ i){...}',最初'Math.floor(arr.length/size)'等於5,但是每一次執行都會通過'size'縮小'arr.length'的大小,所以現在你有了'for(i = 1; i <=(Math.floor(7/2))+ 1; ++ i){...} (i = 2; i <=(Math.floor(5/2))+ 1; ++ i){...}'和'for(i = 3; i <=(Math.floor (3/2))+ 1; ++ i){...}不會執行。所以你只做3次而不是5次。希望這是有道理的。 – brigysl

+0

@brigysl是的,謝謝!我忘了這一個..拼接是危險的! – Mike

回答

1

由於您使用Array#splice刪除元素,因此數組長度會減小,因此不會計算範圍緩存for循環條件的範圍。儘管使用Math.ceil並避免了不必要的if語句。

function chunkArrayInGroups(arr, size) { 
 
    var newArr = [], 
 
    range = Math.ceil(arr.length/size); 
 

 
    for (i = 0; i < range; i++) { 
 
    newArr.push(arr.splice(0, size)); 
 
    } 
 

 
    return newArr; 
 
} 
 
console.log(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2));

+2

謹慎向OP解釋爲什麼? –

+0

@MikeC:updated –

2

使用一個簡單的循環forArray#slice,因爲片不改變原有數組的長度:

function chunkArrayInGroups(arr, size) { 
 
    var chunked = []; 
 
    
 
    for(var i = 0; i < arr.length; i += size) { // increment i by the size 
 
    chunked.push(arr.slice(i, i + size)); 
 
    } 
 
    
 
    return chunked; 
 
} 
 

 
var result = chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2); 
 

 
console.log(result);

+0

我認爲最後的.slice()必須完全適合數組索引,在這種情況下(0,1):o 它完美地工作,謝謝! – Mike

+0

不客氣:) –

0

檢查了這一點。

function chunkArrayInGroups(arr, size) { 
 
    newArr = []; 
 
    for (i=0,j=arr.length; i<j; i+=size) { 
 
     newArr.push(arr.slice(i,i+size)); 
 
    } 
 
    return newArr; 
 
} 
 
console.log(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2)); 
 
// expected - [[0, 1], [2, 3], [4, 5], [6, 7], [8]]

0

另一種方式來做到這一點是Array#reduce

function chunkArrayInGroups(arr, size) { 
 
    return arr.reduce(function (accum, elem) { 
 
     var curr = accum[accum.length - 1]; 
 
     if (curr.length < size) curr.push(elem); else accum.push([elem]); 
 
     return accum; 
 
    }, [[]]); 
 
} 
 

 
var result = chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2); 
 
console.log(JSON.stringify(result));

0

歡迎SO。這是我將如何做到這一點。如果您對此方法有任何疑問,請告知我們。

function chunkArrayInGroups(arr, size) { 
 
    var newArr = []; 
 
    while(arr.length > 0){ 
 
    newArr.push(arr.splice(0, size)); 
 
    } 
 
    return newArr; 
 
}

0

你可以使用一個while循環和拼接所需尺寸的長度爲分組陣列。

function chunkArrayInGroups(array, size) { 
 
    var result = []; 
 
    while (array.length) { 
 
     result.push(array.splice(0, size)); 
 
    } 
 
    return result; 
 
} 
 

 
console.log(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2));

0

功能,你可以做如下:

function chunkArrayInGroups(a,g){ 
 
    return Array(Math.ceil(a.length/g)).fill() 
 
            .map((_,i) => [a[g*i]].concat(a.slice(g*i+1, g*i+g))); 
 
} 
 

 
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8]; 
 
result = []; 
 

 
result = chunkArrayInGroups(arr,2); 
 
console.log(JSON.stringify(result)); 
 

 
result = chunkArrayInGroups(arr,3); 
 
console.log(JSON.stringify(result)); 
 

 
result = chunkArrayInGroups(arr,4); 
 
console.log(JSON.stringify(result));