如何使用JavaScript的reduce方法实现指定格式的数组切片组合
解决你的reduce数组转换问题
你的目标是把数组 [1,1,1,0,0,0] 转换成 [[1,1,1], [1,1,0], [1,0,0], [0,0,0]],但当前的reduce代码会产生多余元素,核心问题是没控制好需要处理的索引范围——原数组长度为6,要截取长度为3的子数组,起始索引只能是0、1、2、3(因为3+3=6,刚好取满3个元素),而你的代码遍历了所有索引(0到5),导致i=4和5时截取到长度不足3的数组,最终结果出现冗余内容。
修正后的reduce代码
var x = [1,1,1,0,0,0]; var y = x.reduce((data, val, i, arr) => { // 仅当起始索引i加上3不超过数组长度时,才截取完整的3元素子数组 if (i <= arr.length - 3) { data.push(arr.slice(i, i + 3)); } return data; }, []); console.log("check y", y); // 输出: check y [ [ 1, 1, 1 ], [ 1, 1, 0 ], [ 1, 0, 0 ], [ 0, 0, 0 ] ]
原代码的问题分析
原代码里的 i%2==0 ? data.push(...) : data.push(...) 完全是多余的——不管条件真假都执行相同的push操作,相当于每遍历一个索引就push一次子数组。当i=4时,slice(4,7) 得到 [0,0];i=5时,slice(5,8) 得到 [0],这两个不符合你想要的格式,还会让结果数组长度变成6而非期望的4。加上 i <= arr.length -3 的判断后,就只处理能截取到完整3元素子数组的索引,刚好得到4个符合要求的结果。
可选的简洁写法
如果你觉得reduce的逻辑有点绕,也可以用 Array.from 实现,可读性更强:
var x = [1,1,1,0,0,0]; var y = Array.from({ length: x.length - 2 }, (_, i) => x.slice(i, i + 3)); console.log(y); // 同样输出目标数组
内容的提问来源于stack exchange,提问作者Naveen Asapu
相关产品推荐
相关产品推荐

