2016-12-01 61 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));