JS - 将数组拆分为n组,每组应具有随机数量的密钥

时间:2016-07-22 14:18:13

标签: javascript

我有一个像这样的数组

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组),每组的关键数量每次都不同

4 个答案:

答案 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);