JavaScript:使用Reduce方法合并多数组结果不符合预期求助
问题分析与解决方案
Let's break down what's going wrong here and fix it step by step.
核心问题:数组相加的行为误解
你的代码里最关键的错误是JavaScript中数组与数组相加(a + e)的行为不是合并数组,而是字符串拼接。
看你的reduce逻辑细节:
- 你初始化累加器
a为一个空数组[] - 第一次循环时,
e是arr1([5,10,15,20]),执行[] + [5,10,15,20]时,JS会先把两个数组转为字符串(空数组转成"",arr1转成"5,10,15,20"),拼接后得到字符串"5,10,15,20" - 后续循环中,
a已经是字符串类型,和其他数组相加会持续做字符串拼接,最终输出自然是无方括号的长字符串,而非你期望的数组格式
修正方案:实现数组合并(符合你的期望输出)
如果你想要的是把所有输入数组合并成一个数组(你的期望输出应该是漏写了逗号的笔误),需要用正确的数组合并方式:
方法1:使用Array.concat()
const intersection = (arr) => { return arr.reduce((a,e) => a.concat(e), []) }
方法2:使用扩展运算符...
const intersection = (arr) => { return arr.reduce((a,e) => [...a, ...e], []) }
调用修正后的函数,会输出符合预期的数组:[5, 10, 15, 20, 15, 88, 1, 5, 7, 1, 10, 15, 5, 20]
额外提醒:函数名的歧义
注意你的函数名叫intersection,这个词在编程领域通常指数组交集(即同时存在于所有输入数组的元素)。如果这才是你真正的需求,那当前逻辑完全偏离,正确的交集实现如下:
const intersection = (arrays) => { // 以第一个数组为基准,筛选出所有数组都包含的元素 return arrays[0].filter(item => arrays.every(arr => arr.includes(item)) ) } // 调用后输出:[5, 15](这两个元素在三个数组中都存在)
内容的提问来源于stack exchange,提问作者PineNuts0
相关产品推荐
相关产品推荐

