如何将数组转换为指定顺序,以实现按3元素分块处理?
如何将数组按3元素分块后按列提取重组
我完全明白你的需求——就是把原数组按每3个元素分成块,然后像读表格列一样把每一列的元素依次拿出来拼合成新数组,对吧?不管你是处理整数数组还是对象数组,这个逻辑都是通用的,下面给你两种实用的实现方式,你可以根据项目情况选择:
方法一:原生JavaScript实现(无依赖)
这个方法不需要任何第三方库,纯原生JS就能搞定,核心是通过计算索引来按列取元素:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; const chunkSize = 3; // 计算需要分成多少块(向上取整,处理最后一块不足3个元素的情况) const totalChunks = Math.ceil(arr.length / chunkSize); const newArr = []; // 遍历每一列(0、1、2,对应每块的第1、2、3个元素) for (let colIndex = 0; colIndex < chunkSize; colIndex++) { // 遍历每一块,取出当前列的元素 for (let chunkIndex = 0; chunkIndex < totalChunks; chunkIndex++) { const originalIndex = chunkIndex * chunkSize + colIndex; // 确保索引不越界(最后一块可能没有当前列的元素) if (originalIndex < arr.length) { newArr.push(arr[originalIndex]); } } } console.log(newArr); // 输出:[1, 4, 7, 10, 13, 2, 5, 8, 11, 3, 6, 9, 12]
逻辑说明:
- 先算出原数组能分成多少块,比如13个元素按3个分,会分成5块(前4块3个,最后1块1个)
- 然后按列遍历:先取所有块的第0个元素(1、4、7、10、13),再取所有块的第1个元素(2、5、8、11),最后取所有块的第2个元素(3、6、9、12)
- 处理对象数组时,直接push原数组的对象即可,逻辑完全一致
方法二:结合Lodash实现(简化代码)
如果你项目里已经在用Lodash,可以用它的工具函数快速实现,代码更简洁:
const _ = require('lodash'); const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; // 第一步:把原数组按3个元素分块 const chunkedArr = _.chunk(arr, 3); // 第二步:转置二维数组(把行和列交换) const transposedArr = _.zip(...chunkedArr); // 第三步:把转置后的二维数组扁平化 const newArr = _.flatten(transposedArr); console.log(newArr); // 同样输出目标数组
逻辑说明:
_.chunk(arr, 3)会把原数组分成[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13]]_.zip(...chunkedArr)会转置这个二维数组,得到[[1,4,7,10,13],[2,5,8,11],[3,6,9,12]]_.flatten把转置后的数组拼平成一维数组,就是你要的最终顺序- 同样,处理对象数组时不需要修改任何代码,直接复用即可
内容的提问来源于stack exchange,提问作者senty
相关产品推荐
相关产品推荐

