You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单行reduce语句因push报错:TypeError: arr1.reduce is not a function

问题分析与解决

你的核心问题是reduce累加器的类型被意外改变,导致后续操作无法调用数组方法。具体原因有两个:

  1. 未设置reduce的初始值:如果不给reduce传第二个参数(初始累加器),第一次迭代时acc会是数组的第一个元素(而非空数组),直接破坏了累加器的数组类型。
  2. 错误使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:42:07