JavaScript 数组分块的具体方法

JavaScript specific way off array chunking

我有这样的数组:

[{i: 0, abc: true}, {i: 1, abc: true}, {i: 2, abc: true}, {i: 3, abc: true}, {i: 4, abc: true}, {i: 5, abc: true}, {i: 6, abc: true}, {i: 7, abc: true}, {i: 8, abc: true}, {i: 9, abc: true}, {i: 10, abc: true}, {i: 11, abc: true}, ]

我也需要对它进行分块,输出如下:

[[{i: 0, abc: true}, {i: 1, abc: true}, {i: 2, abc: true}], [{i: 3, abc: true}, {i: 4, abc: true}, {i: 5, abc: true}], [{i: 5, abc: true}, {i: 6, abc: true}, {i: 7, abc: true}], [{i: 7, abc: true}, {i: 8, abc: true}, {i: 9, abc: true}], [{i: 9, abc: true}, {i: 10, abc: true}, {i: 11, abc: true}] ]

子数组中的最后一个对象与下一个子数组中的第一个对象相同。

目前我写的是这样的:

const chunk = (arr, size) => Array.from( { length: Math.ceil(arr.length / size) }, (v, i) =>
arr.slice(i * size, i * size + size));

但它只是按特定数量的元素分块。我也可以通过奇怪的嵌套循环来实现我的目标..但也许有人知道更好..更简单的方法?

如果当前块索引 (i) 不为 0,您可以从切片开始和结束中删除 1。但是,由于我们将索引向后移动 1,因此我们可能有更多块。我们需要将总块数与递减索引和不递减索引进行比较,并相应地增加页数。

const chunkMinus1 = (arr, size) => {
  const chunks = Math.ceil(arr.length / size)
  const maxItems = chunks * (size - 1) + 1
  const length = chunks + Math.ceil(Math.max(arr.length - maxItems, 0) / size)
  
  return Array.from(
    { length }, 
    (v, i) => arr.slice(i * size - (i ? 1 : 0), i * size + size - (i ? 1 : 0))
  )
};

const arr = [{i: 0, abc: true}, {i: 1, abc: true}, {i: 2, abc: true}, {i: 3, abc: true}, {i: 4, abc: true}, {i: 5, abc: true}, {i: 6, abc: true}, {i: 7, abc: true}, {i: 8, abc: true}, {i: 9, abc: true}, {i: 10, abc: true}, {i: 11, abc: true}]

const result = chunkMinus1(arr, 6)

console.log(result)

这是一个非常简单的方法。

使用模数每第 n 个元素引入一个新数组(对于你的情况,每三分之一),找到第 n 个元素并将元素添加到最后一个子数组。

Fiddle 证明:https://jsfiddle.net/2pzcLv9k/

   const result = input.reduce((acc, x, i) => {
   if (i % 3 === 0) {
     acc.push([x])
   } else {
     acc[acc.length - 1].push(x)
   }
   return acc;
 }, [])