【问题标题】:JavaScript - split array into groups with random number of objectsJavaScript - 将数组分成具有随机数量对象的组
【发布时间】:2014-05-10 06:33:11
【问题描述】:

我正在开发这个小应用程序,我有一个包含 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"]...

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

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

【问题讨论】:

  • 您想将数组拆分成一定数量的组吗?
  • 每组中是否有最小-最大元素数量?
  • 是否有关于如何拆分它们的规则,如组数和组大小?

标签: javascript arrays split slice


【解决方案1】:

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

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

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

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"]]

或者,您可以根据需要将其原型化为 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)

【讨论】:

  • 这正是我所需要的。非常感谢!!
【解决方案2】:

以下是您可能想做的框架:

var initial = ["a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10"];
var modifiedArrays = [];
var totalItems = 0
var arraySize = 1

while (totalItems < initial.length) {
    if ((initial.length - totalItems) <= 30)}
        arraySize = initial.length - totalItems
        totalItems += arraySize
    }
    else
    {
        arraySize = Math.floor((Math.random()*30)+1);
        totalItems += arraySize
    }

    modifiedArrays.push(initial.slice(totalItems - arraySize, arraySize + 1));
}

免责声明:我对 JavaScript 的经验很少,而且这段代码完全未经测试,所以请原谅任何错误。此外,此脚本需要 1 到 30 个元素的块。

【讨论】:

    【解决方案3】:

    我做了一些假设,即没有设置数组数量的大小或最小大小。

    var original = ["a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19"];
    
    var results = [];
    
    var breaker = function(arr){
       if(arr.length === 0){
          return;
       }
       var pieceSize = Math.floor(Math.random()*arr.length) + 1,
           result = arr.splice(0, pieceSize);
       results.push(result);
       breaker(arr);   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 2012-08-28
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多