首页 > 解决方案 > 如何根据人员数组长度的可分值准备数组?

问题描述

下面是一组人员 ID

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

我想从数组的末尾开始将它分成 N 组或更少的组。

人:5
划分:单/双(N = 2)

// Below output expected
var arrResult = [
 [1], [2,3], [4,5]
];

人:5
划分:单/双/三(N = 3)

// Below output expected
var arrResult = [
 [1,2], [3,4,5]
];

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

// Below output expected
var arrResult = [
 [1], [2,3,4,5]
];

有人可以帮我完成预期的输出吗?

提前谢谢你!

标签: javascriptarraysdivide

解决方案


创建一个函数非常简单,该函数接受一个值数组、一个大小数组以及基于此的块。

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

这个怎么运作:

首先,您使用起始块大小(数组的最后一个值chunkspop来修改数组,并定义一个结果数组。然后在原始数组仍有元素时循环,检查是否需要更改块大小,然后对数组进行分块。

如果您希望它可重用,以确保原始数组不会被修改,您可以在函数内使用浅拷贝:

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


推荐阅读