首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组分割成相等的块,然后分配剩余的

将数组分割成相等的块,然后分配剩余的
EN

Stack Overflow用户
提问于 2021-08-25 06:02:05
回答 2查看 1.6K关注 0票数 0

我有一个数组,在这个数组中,我需要将、person数、块、等分。

  1. 如果数组中有100项可供10人使用,则每10项创建10个块
  2. 如果每个人有100个条目,那么要创建9个块,每个块将得到9个条目,额外的部分应该给第一个人,第二个人,等等。,意思是person 1= 10;person 2,3,4…会有9件物品
  3. 如果有100项在数组中为11人,11块将被创建,每个将得到10,额外的应该给予第一个人。这意味着

人1是10人2是9人3是9人4是9人5是9人6是9人7是9人9人9人10是9人11是9

我试过了

代码语言:javascript
复制
Object.defineProperty(Array.prototype, 'chunk', {
    value: function(chunkSize) {
        var array = this;
        return [].concat.apply([],
            array.map(function(elem, i) {
                return i % chunkSize ? [] : [array.slice(i, i + chunkSize)];
            })
        );
    }
});

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ..., 150, 151].chunk(Math.floor(151 / 31))

但那会给我一个不正确的分配。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-25 06:35:52

使用除法的其余部分来获得需要额外元素的片数。然后使用新数组(分块)中的索引来确定是否需要该额外元素(即当该索引小于其余元素时)。

注:我不会改变阵列原型。让它成为一个简单的函数。

执行情况:

代码语言:javascript
复制
function partition(arr, length) {
    let rest = arr.length % length;
    let size = Math.floor(arr.length / length);
    let j = 0;
    return Array.from({length}, (_, i) => arr.slice(j, j += size + (i < rest)));
}

let data = Array.from({length: 151}, (_,i) => i+1);
let result = partition(data, 31);
console.log(result);

票数 0
EN

Stack Overflow用户

发布于 2021-08-25 06:13:00

您可以使用发电机在块中拆分数组:

代码语言:javascript
复制
function* chunks(arr, n) {
  for (let i = 0; i < arr.length; i += n) {
    yield arr.slice(i, i + n);
  }
}

let a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ..., 150, 151];
console.log([...chunks(a, Math.floor(151 / 31))]);

然后,您可以修改这段代码,以便首先移动最后一个元素(如果您希望第一个人是最空的)。

作为附带说明,您可以替换以下内容:

代码语言:javascript
复制
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ..., 150, 151];

在这方面:

代码语言:javascript
复制
let a = [...Array(151).keys()];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68917583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档