2017-03-01 75 views
0

首次发布。抱歉格式不正确。我试图让我的功能工作。目前的问题是递归函数在第一个数组元素被调用时会立即停止。即使在调用数组后,我仍然需要它继续前进。我想将数组展平。修复使用包含其他数组的元素的数组的递归函数。它生成一个没有其他数组作为元素的数组

function steamrollArray(arr) { 
    var newArr=[]; 
    //return Array.isArray(arr[2]); 

    //takes an array of which some elements will also be arrays and pushes its non-array elements to a new array (newArr) 
    function recurseArr(a){ 
     for (i=0; i<a.length; i++){ 
     //recursion where you take the array element (also an array) and apply the same function until you get an element 
     if(Array.isArray(a[i])){ 
      //&& i==a.length 
      recurseArr(a[i]); 
     } 
     //case where the original array element is not an array but an element already 
     else{ 
      newArr.push(a[i]); 
     } 
     } 
    } 
    //end of recurseArr 

    recurseArr(arr); 
    return newArr; 
} 

steamrollArray([1, 2, [2, 3], 2, [[[4]]]]); 

期望的输出:[1,2,2,3,2,4]

+0

是你的意图扁平化阵列?即要求的输出是:[1,2,3,2,4]? – jgr0

+0

您可以请您发布您想要的最终期望输出。 – sailesh

+0

你必须停止在你的代码元素之间放置这么多行。您还需要使用一致的格式和缩进。不要混合标签和空格。在stackoverflow上空间效果最好。没有人可以看到你的代码在做什么,否则。 – ErikE

回答

1

你有两个问题。

  1. 您正在混合两种样式的输出。一方面,它看起来像你的函数返回值。但另一方面,它看起来最终的输出应该来自newArr。实际上,代码大部分是正确的,但你需要坚持使用newArr范例,并停止尝试从内部函数返回。

    解决这个问题是这样的:

    if(Array.isArray(a[i])){ 
        //&& i==a.length 
        recurseArr(a[i]); // get rid of `return` 
    } 
    

    这:

    return newArr; // remove this 
    

    这:

    // return recurseArr(arr); // don't do this 
    recurseArr(arr); 
    return newArr; 
    
  2. 你不varlet声明你的计数器变量i 。这意味着它没有函数范围,但实际上是全局范围的成员,如浏览器中的window或Node中的其他内容,因此您要在每个循环中修改相同的i实例(就像您已在外函数之前声明var i)。

使得无论这些变化,现在产量(评论更容易理解删除):

function steamrollArray(arr) { 
    let newArr = []; 

    function recurseArr(a) { 
     for (let i = 0; i < a.length; i += 1) { 
     if (Array.isArray(a[i])) { 
      recurseArr(a[i]); 
     } 
     else { 
      newArr.push(a[i]); 
     } 
     } 
    } 
    recurseArr(arr); 
    return newArr; 
} 

这完美的作品。

+0

如果我进行这些编辑,它似乎将我送入无限循环。我是否也应该消除递归函数内的return newArr? –

+0

是的,没错。尝试删除它。 – ErikE

+0

另外,我不需要我的递归函数中的某种回报?否则,输出将会是不确定的,对吗? –

0

主要问题是你的循环内部有return语句。 The return statement exits your for loop

如果你的主要目的就是击败阵,你是关闭使用工具库一样lodashramda,其中扁平化只是一个更好的:

R.flatten([1, 2, [2, 3], 2, [[[4]]]]) 
+0

谢谢!不幸的是,我需要用基本的javascript创建我自己的功能(这是一门课程)。我在递归函数中消除了返回值。但无论我尝试过什么,我都无法让它停止无限循环。 –

+0

@DavidMorales我将这个问题标记为[在JavaScript中合并/拼合数组数组]的一个副本(http://stackoverflow.com/questions/10865025/merge-flatten-an-array-of-arrays-in-javascript ) - 那里有无数的答案,可以帮助你实现你的目标 - 即使是你的目标也是如此。 – naomik

+0

除了你所指的链接不是我想要做的。我的函数需要一个数组,它的元素本身就是数组,因此一个简单的concat不会使数组扁平化。我也想弄清楚为什么我的特殊功能不起作用。我可以将其他人的解决方案复制到这个扁平化问题上,但我想知道我在做什么错误。谢谢! –

相关问题