登录 立即注册

首页 > 绿虎论坛 > 建站 > 讨论/求助 (发帖)

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

作者: @Ta

时间: 2023-04-25

点击: 38951

目前是使用这个方法


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

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


[隐藏样式|查看源码]


『回复列表(35|隐藏机器人聊天)』

1.

您的代码中使用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 17:32//)

2.

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

(/@Ta/2023-04-26 17:47//)

3.

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

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

(/@Ta/2023-04-26 18:22//)

4.

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

(/@Ta/2023-04-26 19:06//)

5.
层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
(/@Ta/2023-04-26 19:09//
被锁定
)

6.
层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
(/@Ta/2023-04-26 19:10//
被锁定
)

7.
层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
(/@Ta/2023-04-26 19:12//
被锁定
)

8.
层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
(/@Ta/2023-04-26 19:13//
被锁定
)

9.
层主 @老虎会游泳 于 2023-04-26 20:33 删除了该楼层。
(/@Ta/2023-04-26 19:29//
被锁定
)

10.

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

(/@Ta/2023-04-26 20:27//)

11.
层主 @老虎会游泳 于 2023-04-26 21:07 删除了该楼层。
(/@Ta/2023-04-26 20:56//
被锁定
)

12.

@ChatGPT,4,JS在循环中使用Array.slice()会改变原始数组本身,为什么会发生这种现象?

(/@Ta/2023-04-26 20:58//)

13.

[4] @老虎会游泳,实际上,Array.slice()并不会改变原始数组。Array.slice()方法返回一个新数组,其中包含原数组的一部分元素,但是原数组本身保持不变。可能是您在理解过程中发生了误会。

以下是一个关于Array.slice()用法的简单示例:

const originalArray = [1, 2, 3, 4, 5];

const slicedArray = originalArray.slice(1, 4);

console.log(slicedArray); // 输出:[2, 3, 4]
console.log(originalArray); // 输出:[1, 2, 3, 4, 5]

在这个示例中,我们创建了一个名为originalArray的原始数组。接着,我们使用Array.slice()方法创建了一个名为slicedArray的新数组,其中包含originalArray中从索引1(包括)到索引4(不包括)的元素。最后,我们分别打印slicedArrayoriginalArray。您可以看到originalArray保持不变,而slicedArray包含所需的元素子集。

如果在循环中使用Array.slice()时,原始数组发生了变化,可能是因为在循环过程中对原始数组执行了其他操作,而不是由Array.slice()导致的。请检查您的代码以确保没有对原始数组执行任何修改操作。

(/@Ta/2023-04-26 20:59//)

14.

@ChatGPT,4,请分析在代码执行完成后myArr的值是什么:

function arrayParts(arr, n) {
    let partSize = Math.ceil(arr.length / n); 
    for (let begin = 0; begin < arr.length; begin += partSize) {
        let end = begin + partSize;
        console.log('before', 'begin=', begin, 'end=', end, 'arr.length=', arr.length, 'arr=', arr);
        console.log(arr.splice(begin, end));
        console.log('after', 'begin=', begin, 'end=', end, 'arr.length=', arr.length, 'arr=', arr);
    }
}

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

console.log(myArr.slice(0, 3));
console.log(myArr.slice(3, 6));
console.log(myArr.slice(6, 9));
console.log(myArr.slice(9, 12));

console.log('myArr=', myArr);
console.log(arrayParts(myArr, 5));
console.log('myArr=', myArr);
(/@Ta/2023-04-26 21:01//)

15.

[4] @老虎会游泳,在这段代码中,arrayParts函数接受一个数组arr和一个整数n作为参数,然后将数组分成尽可能相等的n个部分。函数使用splice方法来移除arr中的元素,并将移除的元素打印出来。需要注意的是,splice方法会修改原始数组。

首先,您在console.log中使用slice方法,它不会修改myArr的值,而是返回一个新数组,包含原数组的指定范围内的元素。在这个示例中,您将数组分成了4个部分,但这些操作并不会改变myArr的值。

接下来,您调用了arrayParts(myArr, 5)。这里,n的值是5,所以partSize的值是Math.ceil(11 / 5),即3。因此,函数将myArr分成3个元素的部分。以下是循环的迭代过程:

  1. 第一次迭代:begin=0, end=3splice移除了索引0到2的元素,myArr变为[4, 5, 6, 7, 8, 9, 10, 11]
  2. 第二次迭代:begin=3, end=6,但由于myArr的长度已经减少,此时实际上begin=3, end=6splice移除了索引3到5的元素,myArr变为[4, 5, 6, 11]
  3. 第三次迭代:begin=6, end=9,由于myArr的长度为4,此时循环停止。

在执行完arrayParts(myArr, 5)之后,myArr的值为[4, 5, 6, 11]

以下是打印输出的结果:

[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]
[ 10, 11 ]
myArr= [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
before begin= 0 end= 3 arr.length= 11 arr= [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
[ 1, 2, 3 ]
after begin= 0 end= 3 arr.length= 8 arr= [ 4, 5, 6, 7, 8, 9, 10, 11 ]
before begin= 3 end= 6 arr.length= 8 arr= [ 4, 5, 6, 7, 8, 9, 10, 11 ]
[ 7, 8, 9 ]
after begin= 3 end= 6 arr.length= 4 arr= [
(/@Ta/2023-04-26 21:04//)

16.

@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 21:07//)

17.

@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 21:11//)

18.

@ChatGPT,用js写一个函数,均分数组[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]为5份

(/@Ta/2023-04-26 21:18//)

19.

[Default (GPT-3.5)] [新会话] @echo醉老仙,以下是用JavaScript编写的将数组均分为指定份数的函数:

function chunkArray(arr, numChunks) {
  const chunkSize = Math.ceil(arr.length / numChunks);
  const result = [];
  for (let i = 0; i < arr.length; i += chunkSize) {
    result.push(arr.slice(i, i + chunkSize));
  }
  return result;
}

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
const numChunks = 5;
const result = chunkArray(arr, numChunks);
console.log(result);

这个函数将会返回一个新的数组,其中包含了原始数组arr被分成numChunks份后的结果。在这个例子中,函数的输出结果为:

[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8],
  [9, 10],
  [11]
]

可以看到,原始数组已经被均分为5份,每份包含2或3个元素。

(/@Ta/2023-04-26 21:19//)

下一页 1/2页,共35楼

回复需要登录

5月18日 13:48 星期六

本站由hu60wap6华为CPU驱动

备案号: 京ICP备18041936号-1