使用JavaScript的reduce模拟join函数时的结果异常问题
问题原因分析
你的代码问题出在累加器的布尔判断逻辑上:
原代码里的a ? a + separator + item : item,是通过累加器a是否为“真值”来决定是否拼接分隔符。但空字符串''在JavaScript的布尔判断中属于假值,所以会触发:后面的逻辑,直接返回当前item。
当你调用join(['', '', ''], ',')时:
- 第一次迭代:初始
a是''(假值),返回第一个item也就是'',累加器变为'' - 第二次迭代:
a还是''(假值),返回第二个item也就是'',累加器依然是'' - 第三次迭代:同样逻辑,返回第三个
item,最终结果还是''
完全跳过了分隔符的拼接,自然得不到预期的,,。
修正方案
要解决这个问题,不能用累加器的真假来判断是否是第一个元素,而是要利用reduce回调的第三个参数**当前索引index**来区分是否是首次迭代:
function join(arr, separator) { return arr.reduce((a, item, index) => { return index === 0 ? item : a + separator + item; }, ""); }
这样修改后:
- 当
index === 0时(第一个元素),直接返回当前item,不管它是不是空字符串 - 从第二个元素开始(
index > 0),不管累加器或当前item是什么,都先拼接分隔符再加上item
测试join(['', '', ''], ',')时:
- 第一次迭代:
index=0,返回'',累加器为'' - 第二次迭代:
index=1,返回'' + ',' + '' = ',',累加器为, - 第三次迭代:
index=2,返回',' + ',' + '' = ',,',得到预期结果
内容的提问来源于stack exchange,提问作者user20971016
相关产品推荐
相关产品推荐

