使嵌套数组对数组元素进行分组

时间:2017-11-20 17:20:50

标签: javascript arrays

我有阵列:

arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];

然后我想制作4个元素组。 每次迭代时,必须修改此数组,直到它获得最终结果。

第1步:

arr = [[1,2,3,4],5,6,7,8,9,10,11,12,13,14];

第2步:

arr = [[1,2,3,4],[5,6,7,8],9,10,11,12,13,14];

第3步:

arr = [[1,2,3,4],[5,6,7,8],[9,10,11,12],13,14];

第3步:

arr = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14]];

这怎么可能?

我试过了:

var array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
var i,j,temparray,chunk = 4;
for (i=0,j=array.length; i<j; i+=chunk) {
    temparray = array.slice(i,i+chunk);
    console.log(temparray);
}

但我不知道如何将这个块保存到自己的数组中而不是新数组中。

7 个答案:

答案 0 :(得分:3)

您可以拼接数组,直到长度小于最后一次插入的索引。

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
    i = 0;
    
while (i < array.length) {
    array.splice(i, 0, array.splice(i, 4));
    console.log(JSON.stringify(array));
    i++;
}

答案 1 :(得分:3)

使用Array#reduce方法。

&#13;
&#13;
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
newArr = arr.reduce((acc, item, index) => {
    if ((index) % 4 === 0) {
        acc.push([item]);
    } else {
        acc[acc.length - 1].push(item);
    }
    return acc;
}, []);

console.log(newArr); // [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ], [ 9, 10, 11, 12 ], [ 13, 14 ] ]
&#13;
&#13;
&#13;

答案 2 :(得分:2)

lodash可能比我的实现有更好的性能,但是如果你想用vanilla javascript这样做那么你可以喜欢这个(尽管还有很多其他方法):

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];

var newArr = arr.reduce((acc, val, idx)=>{
	if(idx % 4 === 0){
  	acc.push([]);
  }
  acc[acc.length-1].push(val)
  return acc
}, [])

console.log(newArr);

答案 3 :(得分:1)

lodash方法chunk将为您完成此操作。

result = _.chunk(arr, 4);

答案 4 :(得分:1)

function chunkArray(myArray, chunk_size){
    var index = 0;
    var arrayLength = myArray.length;
    var tempArray = [];

    for (index = 0; index < arrayLength; index += chunk_size) {
        myChunk = myArray.slice(index, index+chunk_size);
        // Do something if you want with the group
        tempArray.push(myChunk);
    }

    return tempArray;
}
// Split in group of 3 items
var result = chunkArray([1,2,3,4,5,6,7,8], 3);
// Outputs : [ [1,2,3] , [4,5,6] ,[7,8] ]
console.log(result);

答案 5 :(得分:1)

只需将其推送到生成的数组:

const chunk = 4, result = []
for (var i = 0, j = array.length; i < j; i += chunk) {
   result.push(array.slice(i,i  + chunk));
}

答案 6 :(得分:1)

我认为如果我使用recursive calls添加另一个解决方案,快乐编码也会很有趣!

在这里测试

function split(arr, offset, res){ 
  
  //stop condition (offset exceeds len of array) 
  if(offset>arr.length) 
	return res; 

  //slice 4 elms 
  res.push(arr.slice(offset,offset+4)); 

  //recursion 
  return split(arr, offset+4, res);
  
}
  
var res = split([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 0, []);

console.log(res);