userProfile
userProfile

Reputation: 141

Make nested array to group array elements

I have array:

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

Then I want to make group of 4 elements. Every iteration, this array must be modified until it get's final face.

Step 1:

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

Step 2:

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

Step 3:

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

Step 3:

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

How is this possible?

I tried this:

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);
}

But I don't know then how to save this chunk into own array and not in the new array.

Upvotes: 1

Views: 172

Answers (7)

Muhammad Soliman
Muhammad Soliman

Reputation: 23756

I thought it would be fun too if I add one more solution using recursive calls, Happy coding!

Test it here

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);

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386560

You could splice the array until the length is smaller than the index of the last insertation.

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++;
}

Upvotes: 3

Mohamed Abbas
Mohamed Abbas

Reputation: 2278

Using Array#reduce method.

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 ] ]

Upvotes: 3

Jonas Wilms
Jonas Wilms

Reputation: 138257

Just push it to the resulting array:

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

Upvotes: 1

U Rogel
U Rogel

Reputation: 1941

lodash probably has better performances than my implementation, but if you are looking to do so with vanilla javascript then you can like this (though many other ways are possible):

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);

Upvotes: 2

user8933532
user8933532

Reputation: 31

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);

Upvotes: 1

Dancrumb
Dancrumb

Reputation: 27529

The lodash method chunk will do this for you.

result = _.chunk(arr, 4);

Upvotes: 1

Related Questions