单行reduce语句因push报错:TypeError: arr1.reduce is not a function
问题分析与解决
你的核心问题是reduce累加器的类型被意外改变,导致后续操作无法调用数组方法。具体原因有两个:
- 未设置reduce的初始值:如果不给reduce传第二个参数(初始累加器),第一次迭代时
acc会是数组的第一个元素(而非空数组),直接破坏了累加器的数组类型。 - 错误使用
push的返回值:acc.push(curr)返回的是数组的新长度(数字类型),如果在三元表达式中直接返回这个值,会把累加器从数组变成数字,后续迭代自然会报错arr1.reduce is not a function。
错误写法示例(导致问题的典型代码)
function deleteNth(arr, n) { // 没有初始值,且返回push的结果(数字) return arr.reduce((acc, curr) => acc.filter(x => x === curr).length < n ? acc.push(curr) : acc ) }
正确的单行reduce写法
方案1:使用扩展运算符返回新数组
function deleteNth(arr, n) { return arr.reduce((acc, curr) => acc.filter(x => x === curr).length < n ? [...acc, curr] : acc , []) // 必须设置初始空数组 }
方案2:用逗号运算符返回原数组(性能更优,无需创建新数组)
function deleteNth(arr, n) { return arr.reduce((acc, curr) => (acc.filter(x => x === curr).length < n && acc.push(curr), acc) , []) // 必须设置初始空数组 }
关键注意点
- 始终给reduce传递初始值
[],确保累加器从一开始就是数组类型。 - 三元表达式的两个分支必须都返回数组:要么返回添加新元素后的数组(用扩展运算符或push后返回原数组),要么返回原数组。
内容的提问来源于stack exchange,提问作者Chidambaram P
相关产品推荐
相关产品推荐

