阵列算法中的分块数组

时间:2016-12-01 19:42:28

标签: javascript algorithm

关于stackoverflow的第一个问题,我正在努力使用这个算法。这应该像5“[[0,1],[2,3],[4,5],[6,7],[8]]”那样在5中切割我的数组,但我得到的只是“[[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]]

如果您对提问方式有任何提示,我很乐意收到任何建议!

7 个答案:

答案 0 :(得分:2)

for使用简单的Array#slice循环,因为切片不会更改原始数组的长度:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

由于使用Array#splice删除元素,因此数组长度会减少,因此不会计算范围缓存Route::get('taglist/{id}', function($id) { $tags = Story::find($id)->tags->select('name', 'id as value')->get(); return $tags; }); 循环条件的范围。虽然使用Math.ceil并避免使用不必要的if语句。

for

答案 2 :(得分:1)

另一种方法是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) );

答案 3 :(得分:1)

您可以使用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));

答案 4 :(得分: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]]

答案 5 :(得分:0)

欢迎来到SO。我就是这样做的。如果您对此方法有任何疑问,请与我们联系。

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

答案 6 :(得分:0)

功能上你可以这样做;

&#13;
&#13;
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));
&#13;
&#13;
&#13;