Разделение массива по значению с учетом шансов и событий - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь создать функцию, которая группирует массив чисел на основе параметра длины. Длина представляет собой максимальную длину каждого подмассива. Код работает так же, как и для получения подмассивов, но я бы хотел отсортировать его по четным и нечетным.

function myFunctionA(myArr1, myVal) {
      newArr = [];
      for ( x = 0; x < myArr1.length; x += myVal) {
        newArr.push(myArr1.slice(x, x + myVal));
      }
      return newArr;
    }
Console.log(myfunction([1,2,3,4,5,6,7,8,9,10],3))

Это возвращает [[1,2,3],[4,5,6],[7,8,9],[10]]

То, что я хотел бы сделать, это go через каждый подмассив за раз, пока подмассивы не станут правильной длины и добавить любые оставшиеся значений в подмассив / с

Это будет выглядеть как

[[1,3,5][2,4,6][7,9][8,10]]

Поскольку arr 0 и arr 1 являются правильной длиной, которую мы указали в операторе console.log, 7 8 9 и 10 остались. Но поскольку они не могут создать полный подмассив, а они четные и нечетные, они образуют два подмассива со стороной 2.

Другие примеры:

myfunction([1,2,3,4,5,6,7],2)
Should return [[1,3],[2,4],[5,7],[6]]

myfunction([1,2,3,4,5,6,7,8],1)
Should return [[1][2][3][4][5][6][7][8]]

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Вы можете взять массив для сбора всех четных и нечетных значений, а затем sh группу, если в ней нет элементов. Имея желаемый размер, создайте новый массив.

function chunkenator(array, size, fn) {
    let groups = [],
        result = [];

    for (let value of array) {
        const group = fn(value);
        if (!groups[group]) groups[group] = [];
        if (!groups[group].length) result.push(groups[group]);
        groups[group].push(value);
        if (groups[group].length === size) groups[group] = [];
    }

    return result;
}

console.log(chunkenator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3, x => x % 2));
console.log(chunkenator([1, 3, 5, 7, 8, 9, 11, 13, 15], 3, x => x % 2));
0 голосов
/ 16 июня 2020

Одна из возможностей - сначала разделить числа на четные и нечетные числа, а затем просто l oop поверх него, вставив числа в новый массив, переключаясь между четными и нечетными числами.

Это не самый чистый фрагмент кода, но он работает.

function myfunction(arr, n) {
  const evenOdd = arr.reduce((acc, e) => {
    const ind = +(e % 2 === 0);
    acc[ind] = acc[ind] || [];
    acc[ind].push(e);
    return acc;
  }, []);

  let ind = 0, res = [[]];

  while (evenOdd[0].length || evenOdd[1].length) {
    for (let i = n; i--;) {
      const val = evenOdd[ind].shift();
      if (val) res[res.length - 1].push(val)
    }
    ind = (ind + 1) % 2
    res.push([])
  }

  res.pop()
  return res;
}

for (const n of [1, 2, 3]) {
  console.log(n,
    myfunction([1, 2, 3, 4, 5, 6, 7, 8], n)
  )
}
...