JavaScript - 将数组分成具有随机数量对象的组

标签 javascript arrays split slice

我正在开发这个小应用程序,我有一个包含 100 多个对象的数组,我想将它们分组。棘手的部分是我希望我新创建的数组包含随机数量的对象。例如:

初始: ["a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11 ", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19"]

修改: ["a0", "a1", "a2"], ["a3", "a4", "a5", "a6", "a7"], ["a8"], ["a9", "a10"]...

我想你明白了。在过去的几个小时里我一直被这个问题困扰着,我就是想不通。

希望你能帮帮我! 非常感谢

最佳答案

由于您没有指定数组的最小数量或每个数组的最小/最大元素,这里有一个通用函数,您可以为每个数组指定最小/最大元素。请注意,尽管这并没有严格执行最小元素,实际上可能不可能 100% 做到这一点,具体取决于原始数组中有多少元素以及随机分配给每个数组元素的元素数量。例如,如果您有 10 个原始元素并且您执行 min 2 max 4,您最终可能会得到 3/3/3/1,因为 min 将被强制执行直到没有足够的执行。你并没有真正给出任何“规则”。

minmax都是可选的,默认为1。如果只指定minmax将默认为 min

还请注意,由于数组是通过引用传递的,因此默认情况下这将“清空”原始数组。如果您想保留原始数组,请取消注释函数中的第一行(如果您选择原型(prototype)化,显然不适用)。

function randChunkSplit(arr,min,max) {
  // uncomment this line if you don't want the original array to be affected
  // var arr = arr.slice();
  var arrs = [],size=1; 
  var min=min||1;
  var max=max||min||1;
  while (arr.length > 0) {
    size = Math.min(max,Math.floor((Math.random()*max)+min));
    arrs.push(arr.splice(0, size));
  }
  return arrs;
}

示例

var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

// randChunkSplit(letters)
[["a"], ["b"], ["c"], ["d"], ["e"], ["f"], ["g"], ["h"], ["i"], ["j"], ["k"], ["l"], ["m"], ["n"], ["o"], ["p"], ["q"], ["r"], ["s"], ["t"], ["u"], ["v"], ["w"], ["x"], ["y"], ["z"]]

// randChunkSplit(letters,3)
[["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["p", "q", "r"], ["s", "t", "u"], ["v", "w", "x"], ["y", "z"]]

// randChunkSplit(letters,1,3)
[["a"], ["b", "c"], ["d", "e"], ["f", "g", "h"], ["i", "j", "k"], ["l"], ["m"], ["n", "o"], ["p", "q"], ["r"], ["s", "t"], ["u", "v", "w"], ["x", "y", "z"]]

// randChunkSplit(letters,2,3) 
[["a", "b", "c"], ["d", "e", "f"], ["g", "h"], ["i", "j", "k"], ["l", "m", "n"], ["o", "p", "q"], ["r", "s", "t"], ["u", "v", "w"], ["x", "y", "z"]]

// randChunkSplit(letters,2,3)
// same thing as before, but notice how this time we end up with just 1 elem left over
[["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["p", "q"], ["r", "s"], ["t", "u", "v"], ["w", "x", "y"], ["z"]]

或者,如果需要,您可以将其原型(prototype)化为 Array,如下所示:

Array.prototype.randChunkSplit = function (min,max) {
  var arrs = [],size=1; 
  var min=min||1;
  var max=max||min||1;
  while (this.length > 0) {
    size = Math.min(max,Math.floor((Math.random()*max)+min));
    arrs.push(this.splice(0, size));
  }
  return arrs;
}

var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

letters.randChunkSplit(1,4)

关于JavaScript - 将数组分成具有随机数量对象的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752781/

相关文章:

javascript - jQuery 模式对话框打开多次

javascript - VideoJS currentTime() 总是返回 0

javascript - contrib hls js 跳过 m3u8 的部分内容,如何防止这种情况

javascript - 是否有一个函数可以在javascript中查找具有重复元素的子数组?

Javascript 不变性和本地数组

javascript - 通过 Javascript 更改范围 slider 背景

c++ - 如何将路径拆分为单独的字符串?

ios - 根据 NSDictionary 键值将 NSArray 拆分为子数组

java - 如何获取 "-"(破折号)前后的文本

javascript - 如何用 javascript 编写一个程序,要求用户输入数字列表,然后计算数字的平均值