【问题标题】:Split array into chunks of N length [duplicate]将数组拆分为长度为 N 的块 [重复]
【发布时间】:2012-07-04 08:14:36
【问题描述】:

如何将一个数组(有 10 个项目)拆分为 4 个块,其中最多包含 n 个项目。

var a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
//a function splits it to four arrays.
console.log(b, c, d, e);

然后打印出来:

['a', 'b', 'c']
['d', 'e', 'f']
['j', 'h', 'i']
['j']

以上假设n = 3,然而,该值应该是动态的。

谢谢

【问题讨论】:

  • 不,我刚刚阅读了slicesplice 文档..
  • 重复问题,见答案:stackoverflow.com/a/10456644/1361399
  • @kikio 如果你不尝试自己而不是要求其他伟大的程序员来做你的肮脏工作,你永远无法成为一个伟大的程序员。
  • @Mageek:我一直在寻找一个内置函数。我知道我可以用一个循环或多个splice 来做到这一点。我应该在这里发布我的测试结果吗? :|但是,我不认为我的工作是dirty...
  • 检查这个解决方案 [Split Array Into Chunks][1] [1]: stackoverflow.com/questions/8495687/split-array-into-chunks

标签: javascript arrays


【解决方案1】:

可能是这样的:

var a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];

var arrays = [], size = 3;
    
while (a.length > 0)
  arrays.push(a.splice(0, size));

console.log(arrays);

参见spliceArray 的方法。

另一种不改变数组的方法,除了在分块之前创建它的浅表副本,可以通过使用slice 和 for...循环来完成:

var a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];

var arrays = [], size = 3;
    
for (let i = 0; i < a.length; i += size)
   arrays.push(a.slice(i, i + size));

console.log(arrays);

虽然是一种更面向函数式编程的方法,但可能是:

const chunks = (a, size) =>
    Array.from(
        new Array(Math.ceil(a.length / size)),
        (_, i) => a.slice(i * size, i * size + size)
    );

let a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];

console.log(chunks(a, 3));
console.log(chunks(a, 2));

具体参见Array.from 以及new Array(n) 的工作原理。

【讨论】:

  • 值得注意的是,此方法变异旧数组。
  • 你能链接到更好的方法吗?
  • 定义“更好”。这是我知道的最简单的方法来做所要求的事情。如果您不想改变原始数组,则可以对其进行浅拷贝。
  • 这里的a 是什么?
  • a 是 OP 问题的一部分。我会将我的答案编辑为正在运行的 sn-p 并包含原始数组,
【解决方案2】:

也许这段代码有帮助:

var chunk_size = 10;
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17];
var groups = arr.map( function(e,i){ 
     return i%chunk_size===0 ? arr.slice(i,i+chunk_size) : null; 
}).filter(function(e){ return e; });
console.log({arr, groups})

【讨论】:

  • 我喜欢你的解决方案。我把它清理了一下,把它变成了一个 JS Bin。谢谢! jsbin.com/dokivomuzake/1/edit?js,console
  • 更好的功能解决方案。
  • const partitionArray = (array, size) =&gt; array.map( (e,i) =&gt; (i % size === 0) ? array.slice(i, i + size) : null ) .filter( (e) =&gt; e )
  • map 中,您可以使用return i%chunk_size===0 &amp;&amp; arr.slice(i,i+chunk_size); 来简化它
  • @Buts - map 遍历数组的每个元素。
猜你喜欢
  • 2014-04-12
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2020-03-13
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多