Javascript 使用递归展平数组中的数组

Javascript 使用递归展平数组中的数组,javascript,arrays,recursion,Javascript,Arrays,Recursion,你能告诉我为什么这个代码不能正常工作吗 Flatte函数假定从输入数组中的任何数组中删除值,并将这些值作为数组返回 函数展平(arr){ //创建一个新数组 设newArr=[]; //创建一个helperFunction 函数helperFunction(helperArr){ //如果是空数组 if(helperArr.length==0){ 返回; } //从数组中获取第一个值并删除该值 设firstArrVal=helperArr.shift(); 设isAnArray=Array.i

你能告诉我为什么这个代码不能正常工作吗

Flatte函数假定从输入数组中的任何数组中删除值,并将这些值作为数组返回

函数展平(arr){
//创建一个新数组
设newArr=[];
//创建一个helperFunction
函数helperFunction(helperArr){
//如果是空数组
if(helperArr.length==0){
返回;
}
//从数组中获取第一个值并删除该值
设firstArrVal=helperArr.shift();
设isAnArray=Array.isArray(firstArrVal);
//如果值是数组
如果(isAnArray){
//对值调用递归函数
返回helperFunction(firstArrVal);
}
//如果值不是数组
否则{
//为新数组添加值
新到达推送(首次到达);
//对数组调用递归函数
返回helperFunction(helperArr);
}
}
//呼叫助手功能
辅助功能(arr);
//返回新数组
返回newArr;
}
log(展平([1,2,3,4],
[
[5]
]
]]));

//正确的输出-[1,2,3,4,5]-我的-[1,2,3,4]
您需要迭代子阵列的所有元素,然后推送它们或调用它们的
帮助功能。你现在

    let firstArrVal = helperArr.shift();
    let isAnArray = Array.isArray(firstArrVal);
将仅合并第一个嵌套值,但不会合并任何超过第0个的嵌套标记。对于数组中的每个值,改用
for
循环:

函数展平(arr){
//创建一个新数组
设newArr=[];
//创建一个helperFunction
函数helperFunction(helperArr){
//如果是空数组
if(helperArr.length==0){
返回;
}
for(设i=0;i]]));
您需要迭代子数组的所有元素,然后对它们进行
推送
或调用
帮助函数
。你现在

    let firstArrVal = helperArr.shift();
    let isAnArray = Array.isArray(firstArrVal);
将仅合并第一个嵌套值,但不会合并任何超过第0个的嵌套标记。对于数组中的每个值,改用
for
循环:

函数展平(arr){
//创建一个新数组
设newArr=[];
//创建一个helperFunction
函数helperFunction(helperArr){
//如果是空数组
if(helperArr.length==0){
返回;
}
for(设i=0;i]]));代码的问题在于您没有迭代(子)数组元素-作为替代,您可以在下面的递归函数中使用(and)

让arr=[1,2,3,4,5]];
设展平=a=>a.flatMap(x=>Array.isArray(x)?展平(x):x);

控制台日志(展平(arr))代码的问题在于您没有迭代(子)数组元素-作为替代,您可以在下面的递归函数中使用(and)

让arr=[1,2,3,4,5]];
设展平=a=>a.flatMap(x=>Array.isArray(x)?展平(x):x);

控制台日志(展平(arr))感谢您的快速响应@CertainPerformance。我试图在不使用任何循环的情况下实现这一点。我认为这可以在没有任何循环的情况下完成。我想用递归我们只能线性旅行。再次感谢。除非每个嵌套数组只包含一个元素,否则您必须使用某种循环遍历每个元素,并检查它是数组还是普通值。如果答案对您有帮助,您可以考虑将其标记为“接受”,以表明您的问题已经解决:谢谢您的快速响应@ CertainPerformance。我试图在不使用任何循环的情况下实现这一点。我认为这可以在没有任何循环的情况下完成。我想用递归我们只能线性旅行。再次感谢。除非每个嵌套数组只包含一个元素,否则你必须使用某种循环来循环每个元素并检查它是否是数组或普通值。当答案对你有用时,你可以考虑把它标记为“接受”,以表明你的问题得到解决:谢谢你指出我的错误。我现在意识到,使用递归遍历多维对象是不可能的。谢谢您的帮助。@DilanWaduge我不明白您所说的“多维对象”是什么意思-但是上面的
flatte
函数是递归的(它在它的体内调用自己),它在多维数组中传播(所以在数组中它是可能的)我指的是对象中的对象。正如您所说,flatMap仅在JavaScript数组上可用。谢谢你指出平面图。这是一个很有用的方法。@DilanWaduge我认为嵌套对象中的递归旅行是可能的-看。谢谢链接。因为in-loop似乎起到了作用。谢谢你的帮助。谢谢你指出我的错误。我现在意识到,使用递归遍历多维对象是不可能的。谢谢你的帮助。@DilanWaduge我不明白你所说的“多维对象”是什么意思-但是上面的
flatte
函数是递归的(它在它的体内调用自己),它在多维空间中运行