我需要一些帮助。 所以我有以下数组:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
我试图将这个数组拆分成长度在给定范围之间的块
const minChunkSize = 2;
const maxChunkSize = 5;
因此,块大小可以是随机生成的minChunksize
和maxChunkSize
之间的任何值。
可能的产出:
[[1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]
or
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
or
[[1, 2], [3, 4, 5, 6, 7], [8, 9, 10]]
or
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
etc...
谢谢您的帮助!
这是一个有点低效的,但你可以创建一个递归方法,逐步slice()一个随机数(在一些min
和max
之间)的数组元素。如果最终生成的结果具有长度小于最小值的some()数组,则该方法会自行调用。
const randSplit = (arr, min, max) =>
{
// Check arguments.
if (min > arr.length || max <= min)
return [arr];
let res = [], i = 0, rnd;
while (i < arr.length)
{
rnd = Math.floor(Math.random() * (max - min)) + min;
res.push(arr.slice(i, i + rnd));
i += rnd;
}
if (res.some(x => x.length < min))
return randSplit(arr, min, max)
else
return res;
}
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(JSON.stringify(randSplit(arr, 2, 5)));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
尽管这不是最有效的解决方案,但您可以尝试生成块,如果最后一项短于最小要求值,则尝试再次生成(递归),如下所示:
const generate = (input, min, max) => {
const random = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
const inner = arr => {
if (arr.length === 0) return;
const minIndex = arr.length < min ? arr.length : min;;
const maxIndex = arr.length < max ? arr.length : max;
const splitIndex = random(minIndex, maxIndex);
const generatedArray = arr.slice(0, splitIndex);
const remainingArray = arr.slice(splitIndex);
if (remainingArray.length === 0) {
return [generatedArray];
} else {
return [generatedArray].concat(inner(remainingArray));
}
};
const result = inner(input);
return result.every(item => item.length >= min) ? result : generate(input, min, max);
};
console.log(
generate(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
2,
4,
)
);
递归函数将完成这项工作:
var N = 150;
var test = Array.apply(null, {length: N}).map(Number.call, Number);
console.log('inputArray', test);
var minChunkSize = 2;
var maxChunkSize = 5;
function chunk(inputArray, minChunkSize, maxChunkSize) {
if(inputArray.length <= maxChunkSize) {
return inputArray;
}
return inputArray.splice(0, Math.round(Math.random() * (maxChunkSize - minChunkSize)) + minChunkSize);
}
function chunkAll(inputArray, minChunkSize, maxChunkSize) {
var ret = [];
while(inputArray.length > maxChunkSize) {
ret.push(chunk(inputArray, minChunkSize, maxChunkSize));
}
if(inputArray.length > 0) {
ret.push(inputArray);
}
return ret;
}
console.log('chunked', chunkAll(test, minChunkSize, maxChunkSize));