问一个js分割数组的问题,

目前是使用这个方法


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

var partIndex = Math.ceil(arr.length / 5); 
for (var i = 5; i >=partIndex; i--) {
   arr.splice(-partIndex ); 
}
结果是:空白,1 2 , 3 4 5 , 6 7 8 , 9 10 11

很显然,当数组的元素在某个数字的时候,可能会发生意想不到的事,那么有没有什么好点的方法来更加平均的分配呢

回复列表(29|显示机器人聊天)
  • @Ta / 2023-04-26 / /

    您的代码中使用splice()函数来删减数组,但是如果数组元素个数不足时,splice()函数的行为会发生变化,导致错误的结果。另外,删减后的数组也不一定是均分的。

    以下是一个根据数组长度均分数组的代码示例:

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    var partCount = 5;  // 将数组分为5部分
    var partSize = Math.ceil(arr.length / partCount);  // 每部分个数
    var result = [];  // 存储结果的数组
    for (var i = 0; i partCount; i++) {
      result.push(arr.slice(i * partSize, (i + 1) * partSize));  // 将分组结果添加到结果数组中
    }
    console.log(result);  // 输出结果
    

    这个代码会将数组按照均等的部分分割,即使原数组元素个数不能被部分数整除也不会出现错误的结果。您可以根据需要调整partCount来分割为不同的部分数。
    白日梦还是要做的blog.wz52.cn

  • @Ta / 2023-04-26 / /

    希望的结果是:11个,足够分5份
    结果是这样
    image.png(24.74 KB)

  • @Ta / 2023-04-26 / /

    @echo醉老仙,你首先需要描述你的目标,输入是什么,想得到的输出是什么,然后别人才能回答。

    展示效果不佳的代码并不能让人推测出你的目标。

  • @Ta / 2023-04-26 / /

    @老虎会游泳,其实很简单,就是想均分,11个元素,分5份,一份至少2个,但是代码实现出来不行,如果改了除法取整,元素数量不一样又可能出现别的不均匀的情况

  • @Ta / 2023-04-26 / /
    被锁定
    层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
  • @Ta / 2023-04-26 / /
    被锁定
    层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
  • @Ta / 2023-04-26 / /
    被锁定
    层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
  • @Ta / 2023-04-26 / /
    被锁定
    层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
  • @Ta / 2023-04-26 / /
    被锁定
    层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
  • @Ta / 2023-04-26 / /

    @老虎会游泳,元素个数11,份数5,我也没说份数是会变的,因此我只需要(合理)均分,很显然2楼的情况并无法实现,并且对其他数量的元素,尽可能(合理)均分,我说实话,看到这一堆回复,我差点以为是个假老虎,问个问题而已,你是受到什么刺激了

  • @Ta / 2023-04-26 / /
    被锁定
    层主 @老虎会游泳 于 2023-04-26 21:07 删除了该楼层。
  • @Ta / 2023-04-26 / /

    @echo醉老仙,不好意思我看错了,slicesplice是两个不同的函数。所以只要这样就行了:

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    console.log(arrayParts(arr, 5));
    
    function arrayParts(arr, n) {
        var result = [];
        var partSize = Math.ceil(arr.length / n); 
        for (var i = 0; i < arr.length; i += partSize) {
            result.push(arr.slice(i, i + partSize));
        }
        return result;
    }
    
  • @Ta / 2023-04-26 / /

    @echo醉老仙,如果想用splice

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; 
    
    var partSize = Math.ceil(arr.length / 5); 
    while (arr.length > 0) {
       console.log(arr.splice(0, partSize)); 
    }
    
  • @Ta / 2023-04-26 / /

    @echo醉老仙,我才发现,我和ChatGPT陷入了完全相同的逻辑陷阱。

    把11个数分成均匀的5份是需要让其中一份有3个,其他有2个。

    按3个分只能分4份。

    按2个分会分出6份。

  • @Ta / 2023-04-26 / /

    这几天用过几次,发现chat都是瞎掰的,它不会验证是否正确,只能机械的给出答案
    image.png(24.79 KB)

    但反复问几次,改变方法后,还真有一个可以实现差不多的

    function divideArrayIntoParts(arr, parts) {
      var results = [];
      var length = arr.length;
      var i = 0;
    
      while (i < length) {
        var size = Math.ceil((length - i) / parts);
        results.push(arr.slice(i, i + size));
        i += size;
        parts--;
      }
    
      return results;
    }
    
    var arrayToDivide = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    var parts = 5;
    var result = divideArrayIntoParts(arrayToDivide, parts);
    
    console.log(result); 
    

    image.png(26.9 KB)
    image.png(57.67 KB)

  • @Ta / 2023-04-26 / /

    @echo醉老仙

    它不会验证是否正确,只能机械的给出答案

    说起来,我确实亲自运行了我这个代码(和GPT给的逻辑一样),而且还运行了好几次,但我没有意识到它只分了4份,根本不符合要求,所以我也直接发出来了。

    可以这么说,除了编造错误结果这一点不一样之外,GPT和我具有一致的行为逻辑

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    console.log(arrayParts(arr, 5));
    
    function arrayParts(arr, n) {
        var result = [];
        var partSize = Math.ceil(arr.length / n); 
        for (var i = 0; i < arr.length; i += partSize) {
            result.push(arr.slice(i, i + partSize));
        }
        return result;
    }
    
  • @Ta / 2023-04-26 / /

    @echo醉老仙,以下是一个真的能分成5份的代码,它会把多余的元素放在末尾:

    let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    let n = 5;
    
    let partSize = Math.floor(arr.length / n);
    for (let i=1; arr.length > 0; i++) {
        if (i == n) {
            partSize = arr.length;
        }
        console.log(arr.splice(0, partSize)); 
    }
    

    图片.png(12.95 KB)

  • @Ta / 2023-04-26 / /

    23楼不好,12个分不均匀
    图片.png(14.04 KB)

  • @Ta / 2023-04-26 / /

    看起来GPT给的答案确实挺好的:
    图片.png(25.8 KB)

添加新回复
回复需要登录