Сортировка массива по 3 куска - PullRequest
0 голосов
/ 26 мая 2018

Предположим, что у вас есть массив, и вы хотите разделить его на куски, равные 3. Если массив равен ..

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

... новый массив будет

let newArr = [1, 4, 7, 10, 13,   2, 5, 8, 11,   3, 6, 9, 12]

// In other words:
1  2  3
4  5  6
7  8  9
10 11 12
13

Чанкинг должен быть таким кодом (если отсортирован как newArr):

let chunkedArr = _.chunk(_.toArray(newArr), 3);

... однако я не мог понять, как отсортировать arr в newArr, чтобы иметь возможностьразбить на части в правильном порядке.Как правильно обрабатывать такой случай?

Обратите внимание, что целые числа являются просто псевдо, и я буду использовать соответствующие объекты массива.

Ответы [ 4 ]

0 голосов
/ 26 мая 2018
const original = [1,2,3,4,5,6,7,8,9,10,11,12,13]
const chunks = 3

function getChunckedArr(arr, n) {
  let sub = new Array(n);
  let result = [];

  for (let i=0; i<sub.length; i++)
    sub[i] = []

  arr.forEach(function (val, index){
    let o = (index % n);
    sub[o][sub[o].length] = val;
  });

  for (let i=0; i<sub.length; i++)
    result.push.apply(result, sub[i]);

  return result;
}

const chunked = getChunckedArr(original, chunks);
0 голосов
/ 26 мая 2018

Пожалуйста, попробуйте следующее ( jsfiddle ):

//This version works for variable chunk sizes as well.
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
alert(chunks(arr, 3)); //You can update chunk size here

function chunks(arr, chunkSize) {
  var result = [];
  var index = 0;
  for (var i = 0; i < chunkSize; i++) {
    for (var j = 0; j < arr.length / chunkSize; j++) {
      if (arr[i + (chunkSize * j)] != null)
        result[index++] = arr[i + (chunkSize * j)];
    }
  }
  return result;
}

//This version only works for chunks of size 3.
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
let subArr1 = [];
let subArr2 = [];
let subArr3 = [];
var result = [];
var i = 0, j = 0, k = 0;

for (var index = 0; index < arr.length; index++) {
  if (index % 3 == 0) {
    subArr1[i++] = arr[index];
  }
  if (index % 3 == 1) {
    subArr2[j++] = arr[index];
  }
  if (index % 3 == 2) {
    subArr3[k++] = arr[index];
  }
}

result.push(subArr1, subArr2, subArr3);
alert(result);
0 голосов
/ 26 мая 2018

Один из вариантов - использовать ES6 reduce для группировки массива в многомерный массив.Используйте concat для сглаживания многомерного массива.

[].concat(...) - в основном сглаживает многомерный массив.Начиная с пустого массива [], вы concat получаете каждый вторичный массив.Используйте оператор распространения (...) для повторения каждого вторичного массива и concat каждый.

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

let newArr = [].concat(...arr.reduce((c, v, i) => {
  let k = i % groups;
  c[k] = c[k] || [];
  c[k].push(v);
  return c;
}, []));

console.log(newArr);
0 голосов
/ 26 мая 2018

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

Спасибо

Вот пример кода.

var i,j,resArr,chunkSize = 10; for (i=0,j=array.length; i<j; i+=chunk) { resArr = array.slice(i,i+chunk); }

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