Javascript嵌套forEach未按预期运行 实现Lodash _.zip功能出错
问题根因
你代码的核心错误出在const newArr = Array(array[0].length).fill([]);这一行。fill方法传入引用类型的参数时,填充到数组所有位置的都是同一个引用的副本。也就是说你创建的newArr里的所有子数组,本质上指向同一个内存地址的数组对象,不管你往哪个下标对应的子数组里push内容,所有子数组都会同步更新,最终就出现了所有子数组内容完全一致、全部元素堆在一起的错误结果。
修复方案
初始化数组时不要用fill创建子数组,改为给每个位置生成独立的空数组即可,修复后的代码如下:
function zip(...array) { // 用Array.from的回调为每个位置生成独立的空数组 const newArr = Array.from({length: array[0].length}, () => []); array.forEach((el, i) => { el.forEach((item, idx) => { newArr[idx].push(item); }); }); return newArr; }
你之前注释掉的newArr[idx][i] = item写法也可以正常运行,只要子数组是独立创建的,两种赋值方式在这个场景下效果一致。
调用zip(['a', 'b'], [1, 2], [true, false])测试,返回结果为[['a', 1, true], ['b', 2, false]],符合预期。
内容的提问来源于stack exchange,提问作者Levan
相关产品推荐
相关产品推荐

