如何从人数组长度的可分割值准备数组?

时间:2019-07-31 07:36:20

标签: javascript arrays divide

下面是人员ID的数组

var arrPeopleIDs = [1,2,3,4,5];

我想从数组末尾开始将其分为N个或更少的组。

人:5
除法:单/双(N = 2)

  • 1个单键和1个键
  • 1个键可与2,3连为一个
  • 1个双键,含4,5
// Below output expected
var arrResult = [
 [1], [2,3], [4,5]
];

人:5
除法:单/双/三倍(N = 3)

  • 1个键可与1,2连用
  • 1键代表三,三,四,五
// Below output expected
var arrResult = [
 [1,2], [3,4,5]
];

人:5
除:单/双/三/四(N = 4)

  • 带有1个单曲的1个键
  • 1键用于具有2,3,4,5的四边形
// Below output expected
var arrResult = [
 [1], [2,3,4,5]
];

有人可以帮助我提供预期的输出吗?

先谢谢您!

2 个答案:

答案 0 :(得分:3)

创建一个需要一个值数组,一个大小数组以及基于其的块的函数相当简单。

function chunkLargest(arr, chunks) {
  let currentChunk = chunks.pop();
  let r = [];
  arr.reverse();
  while (arr.length > 1) {
    if (currentChunk > arr.length) {
      currentChunk = chunks.pop();
    }
    r.push(arr.splice(0, currentChunk));
  }
  return r.reverse().map(e => e.reverse());
}

console.log(chunkLargest([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3]));
.as-console-wrapper { max-height: 100% !important; top: auto; }

工作原理:

首先,使用chunks来获取起始块大小(pop数组的最后一个值)以修改数组并定义结果数组。然后在原始数组仍包含元素的情况下循环,检查是否需要更改块大小,然后对数组进行块化。

如果希望它可重用,以确保不修改原始数组,则可以在函数内部使用浅表副本:

function chunkLargest(a, chunks) {
  let arr = [...a];
  let currentChunk = chunks.pop();
  let r = [];
  arr.reverse();
  while (arr.length > 1) {
    if (currentChunk > arr.length) {
      currentChunk = chunks.pop();
    }
    r.push(arr.splice(0, currentChunk));
  }
  return r.reverse().map(e => e.reverse());
}

const arrPeopleIDs = [1, 2, 3, 4, 5, 6, 7, 8];

console.log(chunkLargest(arrPeopleIDs, [1, 2, 3]));
.as-console-wrapper { max-height: 100% !important; top: auto; }

答案 1 :(得分:2)

像这样分块时将永远只有一个余数,因此您可以安全地对数组进行分块,然后添加余数(如果有的话):

var arrPeopleIDs = [1, 2, 3, 4, 5, 6];

const chunk = (arr, d) => {
  const temp = arr.slice()
  const out = []
  const rem = temp.length % d

  while (temp.length !== rem) out.unshift(temp.splice(temp.length - d, d))
  rem && out.unshift(temp.splice(0, rem))

  return out
}

console.log(chunk(arrPeopleIDs, 1))
console.log(chunk(arrPeopleIDs, 2))
console.log(chunk(arrPeopleIDs, 3))
console.log(chunk(arrPeopleIDs, 4))
console.log(chunk(arrPeopleIDs, 5))

上面是一个函数,它将接收一个数组和一个数字(即块的最大大小),并返回一个分块的数组,从数组末尾开始以最大的块开始,然后其余部分开始。此函数不会修改原始数组-因此可以多次调用