将数组拆分为给定范围之间随机长度的块

问题描述 投票:0回答:3

我需要一些帮助。 所以我有以下数组:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

我试图将这个数组拆分成长度在给定范围之间的块

const minChunkSize = 2;
const maxChunkSize = 5;

因此,块大小可以是随机生成的minChunksizemaxChunkSize之间的任何值。

可能的产出:

[[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...

谢谢您的帮助!

javascript arrays split
3个回答
4
投票

这是一个有点低效的,但你可以创建一个递归方法,逐步slice()一个随机数(在一些minmax之间)的数组元素。如果最终生成的结果具有长度小于最小值的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;}

2
投票

尽管这不是最有效的解决方案,但您可以尝试生成块,如果最后一项短于最小要求值,则尝试再次生成(递归),如下所示:

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,
  )
);

1
投票

递归函数将完成这项工作:

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));
© www.soinside.com 2019 - 2024. All rights reserved.