我有一个像这样的数组
var arr = ['a', 'b', 'c', 'e', 'f', 'g']
我想将此数组拆分为n组。这些组可以持有不同数量的密钥,组不能为空。他们可以持有任何关键的金额。结果应该每次都有所不同。预期结果的一个例子如下:
将数组拆分为3组
[
['a', 'b'],
['c'],
['e', 'f', 'g']
]
将数组拆分为3组的另一个示例结果
[
['a'],
['b'],
['c', 'e', 'f', 'g']
]
正如你所看到的,总会有n组(在这种情况下是3组),每组的关键数量每次都不同
答案 0 :(得分:5)
您可以使用循环和数组的其余部分来创建新的部分。
循环生成一个数字并保留至少一个项目以填充最后一个数组。
var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'],
result = [],
pos = 0,
count = 0,
groupsLeft = 3;
while (--groupsLeft) {
count = Math.floor(Math.random() * (arr.length - count - groupsLeft)) + 1;
result.push(arr.slice(pos, pos += count));
}
result.push(arr.slice(pos, arr.length));
console.log(result);
答案 1 :(得分:1)
var arr = ['a', 'b', 'c', 'e', 'f', 'g'];
var N = 3;
var curr = 0; //current numbers added
var ans = []; //answer array
for(var x = 0; x < N-1; x++){ //go through everything but the last one
var tmp = []; //temporary array
var rdm = Math.floor(Math.random()*(arr.length-curr-(N-x))+1); //random # of #'s in array
for(var y = 0; y < rdm; y++){ //go add those random numbers
tmp.push(arr[curr]);
curr++; //current number being added
}
ans.push(tmp);
}
var tmp = []; //final temporary array
while(curr < arr.length){ //add remaining elements
tmp.push(arr[curr]);
curr++;
}
ans.push(tmp); //add temporary array
console.log(ans); //output
由于分区按顺序排列,并且您知道有多少分区,您可以使用随机数生成器来分发它们。例如,对于第一个数组,您的数组可以包含前M个数字,其中M来自[1,4],因为您不能有一个空列表,也不能只有数字1填充其余数字。
您为所有索引重复此随机数生成,直到您到达最后一个。最后一个只是其余的元素。
答案 2 :(得分:-1)
这个解决方案怎么样?这里jsFiddle以及
function split(array = [], N) {
if (array.length < N || N < 0) {
return array;
}
let result = [];
if (N !== 0) {
result.push(array.slice(0, N));
}
result.push([array[N]]);
if (N !== array.length - 1) {
result.push(array.slice(N + 1, array.length));
}
return result;
}
答案 3 :(得分:-1)
试试这个:
var arr = ['a', 'b', 'c', 'e', 'f', 'g'];
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
var result = [];
var sum = 0;
var len = arr.length;
var left = 3; // number of groups
for (;left--;) {
if (left > 0) {
var pick = getRandomInt(1, len-sum-left-1);
} else {
pick = len-sum;
}
result.push(arr.splice(0, pick));
sum+= pick;
}
console.log(result);