Javascript 错误:acc.concat不是my js平面阵列函数的函数?

Javascript 错误:acc.concat不是my js平面阵列函数的函数?,javascript,flat,Javascript,Flat,我正在尝试编写一个js平面函数,比如 使用concat+递归。然而,我的代码总是抛出acc。concat不是函数错误。我不知道我的代码出了什么问题。有人能帮我解决这个问题吗?提前非常感谢 function flatten (arr) { return arr.reduce((acc, val) => { if (Array.isArray(val)) { acc.concat(flatten(val));

我正在尝试编写一个js平面函数,比如

使用concat+递归。然而,我的代码总是抛出acc。concat不是函数错误。我不知道我的代码出了什么问题。有人能帮我解决这个问题吗?提前非常感谢

   function flatten (arr) {
      return arr.reduce((acc, val) => {
          if (Array.isArray(val)) {
              acc.concat(flatten(val));
          } else {
              return val;
          }
         return acc;
      }, []);
   }

这是因为在执行递归之前,您执行了终止递归的步骤,这会让您绊倒

当您执行
if(Array.isArray(val))
时,您应该决定是否将
val
视为一个数组,并再次进入
展平
,在这种情况下,您可以继续正常处理它。但是,在这两种情况下,您都希望将
val
添加到累加器中,而在
else
分支中,您只需执行
返回val
,因此在下次执行回调时,
acc
将等于
val
,我们已经知道它不是数组

相反,在这两种情况下,都应该添加到数组中。唯一的区别是,一次应该递归地
展平
,另一次不应该。如果终止条件是
flant
的一部分,而不是
reduce
回调的一部分,则这可以简化:

函数展平(数据){
如果(!Array.isArray(data))返回数据;
返回数据.reduce((acc,val)=>acc.concat(展平(val)),[]);
}
常量输入=[[1],[2,[[3]]];

console.log(展平(输入))这是因为在执行递归之前,您执行了终止递归的步骤,这会让您绊倒

当您执行
if(Array.isArray(val))
时,您应该决定是否将
val
视为一个数组,并再次进入
展平
,在这种情况下,您可以继续正常处理它。但是,在这两种情况下,您都希望将
val
添加到累加器中,而在
else
分支中,您只需执行
返回val
,因此在下次执行回调时,
acc
将等于
val
,我们已经知道它不是数组

相反,在这两种情况下,都应该添加到数组中。唯一的区别是,一次应该递归地
展平
,另一次不应该。如果终止条件是
flant
的一部分,而不是
reduce
回调的一部分,则这可以简化:

函数展平(数据){
如果(!Array.isArray(data))返回数据;
返回数据.reduce((acc,val)=>acc.concat(展平(val)),[]);
}
常量输入=[[1],[2,[[3]]];

console.log(展平(输入))我发现了几个问题:

  • 这不是一个函数。它返回一个需要分配或返回的新数组
    acc=acc.concat(展平(val))或<代码>返回acc.concat(展平(val))
  • val
    s在任何时候都不会添加到累加器中<代码>返回值
打破了回调函数的正常约定,即返回累加器供下一个元素使用
const flatte=a=>
a、 减少((acc,val)=>
acc.concat(阵列isArray(val)?展平(val):val
, [])
;

log(展平([1,2,3,4,5,6,7,8,9]])我发现了几个问题:

  • 这不是一个函数。它返回一个需要分配或返回的新数组
    acc=acc.concat(展平(val))或<代码>返回acc.concat(展平(val))
  • val
    s在任何时候都不会添加到累加器中<代码>返回值
打破了回调函数的正常约定,即返回累加器供下一个元素使用
const flatte=a=>
a、 减少((acc,val)=>
acc.concat(阵列isArray(val)?展平(val):val
, [])
;

log(展平([1,2,3,4,5,6,7,8,9]])
返回值
在这种情况下,
reduce
acc
的下一步肯定不是数组。因此,如果
val
是一个数组,
acc.concat
将无法工作。非常感谢!我得到了它。我将代码修改为:函数flatte(arr){return arr.reduce((acc,val)=>{if(Array.isArray(val)){return acc.concat(flatte(val));}else{return acc.concat(val);};它可以工作:我删除了前面的评论(因为它没有足够清楚地解决这个问题),它来自我阅读代码和
acc.concat
,希望
acc
具有
Array
的子类型。然后我看到
返回val
在typeguard中表示“不是数组”,并感到困惑:“为什么会有这样的情况,而这种情况永远不会发生?”。在阅读代码时,请详细说明思路。@ASDFGerte,您完全正确。我修改else以返回acc.contact(val),然后它工作。
return val
在这种情况下,
reduce
acc
的下一步肯定不是数组。因此,如果
val
是一个数组,
acc.concat
将无法工作。非常感谢!我得到了它。我将代码修改为:函数flatte(arr){return arr.reduce((acc,val)=>{if(Array.isArray(val)){return acc.concat(flatte(val));}else{return acc.concat(val);};它可以工作:我删除了前面的评论(因为它没有足够清楚地解决这个问题),它来自我阅读代码和
acc.concat
,希望
acc
具有
Array
的子类型。然后我看到
返回val
在typeguard中表示“不是数组”,并感到困惑:“为什么会有这样的情况,而这种情况永远不会发生?”。在阅读代码时,请详细说明思路。@ASDFGerte,您完全正确。我修改else以返回acc.contact(val),然后它就可以工作了。