нормальный массив в многомерный массив - PullRequest
0 голосов
/ 08 ноября 2018

Я знаю, что уже есть ответ на подобный вопрос, но результат не тот, который я ищу.

Я хочу, чтобы [0,1,2,3,4,5,6,7,8] было вставлено в многомерный массив, например:

[0,3,6], [1,4,7], [2,5,8]

вместо:

[0,1,2], [3,4,5], [6,7,8]

const toMatrix = (arr, width) => 
arr.reduce((rows, key, index) => (index % width == 0 ? rows.push([key]) 
  : rows[rows.length-1].push(key)) && rows, []);

Кроме использования for ... loop, есть ли более короткий способ сделать это?

Ответы [ 5 ]

0 голосов
/ 08 ноября 2018

При желании вы также можете попробовать следующий код.

function splitToArrays(arr, width=1) {
	/**
	 * PARAMETERS:-
	 * 	   arr   : array of numbers (integers in this case)
	 * 	   width : number of elements in each sub array
	 */

	let newArr = [];
	let times  = arr.length / width; 

	for(let i = 0; i < width; i++) // each iteration adds a new sub array to newArr
	{
		let step = 0;
		for(let j = 0; j < times; j = j + 1) { // each iteration adds new element to sub array
			
			if(j === 0) {
				let item = arr[i + step]; // fetch item from array
				newArr.push([item]);      // push item to new array
				step += width;
				continue; // continue with next iteration, 
				          // skip the following statements
			}

			// else
			let item = arr[i + step]; // 0, 3, 6 | 1, 4, 7
			newArr[i].push(item);
			step += width; // increment step's value by 3 in this case
		}
	}

	// finally
	return newArr;
}


function main() {
	// test case
	let a = [0, 1, 2, 3, 4, 5, 6, 7, 8];
	let b = splitToArrays(a, 3); // 3 denotes number of elements inside sub arrays

	console.log(a);
	console.log(b);
}

main();

/*
	[ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]
	[ [ 0, 3, 6 ], [ 1, 4, 7 ], [ 2, 5, 8 ] ]
*/
0 голосов
/ 08 ноября 2018

Хотя есть много решений, уже опубликованных для этого, но в любом случае я собираюсь опубликовать мое, так как считаю его читабельным, жизнеспособным и соответствующим сценарию использования ОП.

const toMatrix = (arr, width) => arr.reduce((rows, key, index) => {
    let chunkLength = Math.ceil(arr.length / width);
    let rowIndex = Math.ceil(index % chunkLength);
    rows[rowIndex] ? rows[rowIndex].push(key) : rows.push([key]);
    return rows;
}, []);

const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8]
const toMatrix = (arr, width) => arr.reduce((rows, key, index) => {
    let chunkLength = Math.ceil(arr.length / width);
    let rowIndex = Math.ceil(index % chunkLength);
    rows[rowIndex] ? rows[rowIndex].push(key) : rows.push([key]);
    return rows;
}, []);

console.log(toMatrix(arr, 3));
console.log(toMatrix(arr, 2));
console.log(toMatrix(arr, 1));
console.log(toMatrix(arr, 4));
console.log(toMatrix(arr, 5));
0 голосов
/ 08 ноября 2018

Вы можете взять остаток с фактическим индексом и передать значение в результирующий набор.

const
    toMatrix = (array, width) => array.reduce((r, v, i) => {
        (r[i % width] = r[i % width] || []).push(v);
        return r;
    }, []),
    format = array => array.map(a => a.join(' '));

console.log(format(toMatrix([0, 1, 2, 3, 4, 5, 6, 7, 8], 2)));
console.log(format(toMatrix([0, 1, 2, 3, 4, 5, 6, 7, 8], 3)));
console.log(format(toMatrix([0, 1, 2, 3, 4, 5, 6, 7, 8], 4)));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 08 ноября 2018

input =[0,1,2,3,4,5,6,7,8]

function divideInGroups (array, groupCount) {
 return input.reduce((acc, curr, index)=> {
   let group = index % groupCount;
   if(!acc[group]) acc[group]=[];
   acc[group].push(curr);
   return acc
 },[])
}

console.log("3 Groups", divideInGroups(input,3));
console.log("2 Groups", divideInGroups(input,2));
console.log("1 Groups",divideInGroups(input,1));
console.log("5 Groups",divideInGroups(input,5));
0 голосов
/ 08 ноября 2018

Вы можете попробовать это. Я использовал «Array.reduce» с «Object.values» для достижения этой цели.

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

var toMatrix = (arr, width) => {

  let gap = Math.ceil(arr.length/width)
  
  return Object.values(arr.reduce((o,d,i) => (o[i%gap] = (o[i%gap] || []).concat(d), o), {}))
}

console.log(toMatrix(arr, 3))

console.log(toMatrix(arr, 2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...