【问题标题】:How to split an array into even length chunks? [duplicate]如何将数组拆分为偶数长度的块? [复制]
【发布时间】:2019-11-16 04:35:49
【问题描述】:

我想将数组分割成均匀(或尽可能均匀)的块。 函数的输入应该是数组和块的大小。 假设你有数组

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]

如果你把它放在下面的函数中,以 5 作为块大小,它将导致以下结果

[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17]

但是,我希望结果是

[[1,2,3,4,5],[6,7,8,9],[10,11,12,13],[14,15,16,17]

这意味着牺牲之前数组的长度,使它们的长度仅相差一个。

我目前正在使用的功能如下所述。我已经用模数尝试了各种东西,但我无法弄清楚。

function chunkArray(myArray, chunkSize){
var arrayLength = myArray.length;
var tempArray = [];

for (index = 0; index < arrayLength; index += chunkSize) {
    myChunk = myArray.slice(index, index+chunkSize);
    // Do something if you want with the group
    tempArray.push(myChunk);
}

return tempArray;

}

【问题讨论】:

  • 为什么第二个chunk的长度是4?其背后的规则是什么?
  • 没有明确的基础来获取输出。有吗?
  • 预期结果,如果最后一个数组只剩下2个元素,任何squenece或顺序?请提供可能的场景

标签: javascript arrays


【解决方案1】:

使用此解决方案,您可以均匀拆分数组项目,直到最后一个包含任何剩余项目的项目(长度小于块大小的项目集合。)

const a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
const chunk = 4

const chunk_array = (a, c) => {
  let arr = []
  
  a.forEach((_, i) => {
    if (i%chunk === 0) arr.push(a.slice(i, i+chunk))
  })
  
  const [left_overs] = arr.filter(a => a.length < chunk)
  
  arr = arr.filter(a => a.length >= chunk)
  
  arr[arr.length-1] = [...arr[arr.length-1], ...left_overs] 
  
  return arr
}

console.log(
  chunk_array(a, chunk)
)

【讨论】:

  • 如果块数大于数组长度的 1/2,应该再添加一个情况
  • 好主意,如果它大于原始长度的 1/2,我们只保留 left_over 数组吗? @RinorDreshaj
  • 好吧,我想如果剩余的大小是
  • 稍后我将不得不这样做。得走了!随意进行编辑:-)
  • 干得好顺便说一句?
【解决方案2】:

我的解决方案!

const chunk = (arr, chunkSize) => {
  let chunked = [];
  for (let i = 0; i< arr.length; i+=chunkSize){
    chunked.push(
      arr.slice(i, (i + chunkSize))
    );
  }

  return chunked;
};

const data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17];

console.log(chunk(data, 5));
// returns [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17]]

【讨论】:

  • OP 中的 5 只是一个示例数字,他不想制作 5 个块。 OP 希望根据数组大小创建相等数量的块。
【解决方案3】:

如果你的数组长度是奇数,你可以用模检查:

let MY_CHUNK_CONST = 5
let first_chunk_size = MY_CHUNK_CONST,
other_chunk_size = MY_CHUNK_CONST;
let myArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17];
modulo_res = myArray.length % 2; // 0 if even 1 if odd

if(modulo_res){
 other_chunk_size = first_chunk_size - 1;
}

var tempArray = [];

myChunk = myArray.slice(0, 0+first_chunk_size);
tempArray.push(myChunk);
for (index = 1; index < myArray.length; index += other_chunk_size) {
    myChunk = myArray.slice(index, index+other_chunk_size);
    // Do something if you want with the group
    tempArray.push(myChunk);
}

console.log(tempArray)
// [[1,2,3,4,5],[6,7,8,9],[10,11,12,13],[14,15,16,17]

希望对你有帮助。

【讨论】:

  • 奇数,意思是“并非所有块的大小都相同”
  • OP 中的 5 只是一个示例数字,他不想制作 5 个块。 OP 希望根据数组大小创建相等数量的块。
  • 是的,这就是我使用 5 的原因。然后他就可以决定他想要输入哪个值。
猜你喜欢
  • 2012-07-04
  • 2013-02-06
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
相关资源
最近更新 更多