【发布时间】:2019-07-04 08:21:24
【问题描述】:
我对问题的逻辑,使用以下内容作为输入。
var input = [['A','B'],1,2,3,['C','D']]
- 使用 Array.isArray(input) 检查第一个元素是否为数组
- 如果第一个元素是数组,调用函数,第一个元素 ['A,'B'] 作为参数。
- 嵌套数组的第一个元素是“A”,它不是一个数组,因此将该元素推入结果数组,然后将该元素移出。重复函数调用。
当尝试使用递归展平嵌套数组时,我的函数输入变量不断被重新分配,从而阻止我使用原始数组再次调用该函数。如何防止原始输入变量被重新分配?
我知道这不是完整的解决方案,但是当我将第一个元素移出嵌套数组时,我被卡住了。
这个功能我是一步一步经历的,但一定有什么我遗漏的,另一双眼睛会有很大帮助。
我也一直在用我的chrome开发者工具,设置断点一步步监控功能。
//Defining original input variable
var input = [['A','B'],1,2,3,['C','D']]
function flat(array){
var result = []
var firstElement = array[0]
//CHECK IF FIRST ELEMENT IS ARRAY OR NOT
if(Array.isArray(firstElement)){
return flat(firstElement)
}
//IF ELEMENT NOT ARRAY, PUSH ELEMENT TO RESULT
else{result.push(firstElement)
array.shift() //removing child element
return (flat(array)) //call function on same array
}
if(array.length===0){return result}
}
第一次迭代: firstElement = ['A','B'], Array.isArray(firstElement) 为真,因此调用 flat(firstElement)
第二次迭代: firstElement = 'A', Array.isArray(firstElement) 为假,所以我们 1. 下跳将这个元素推入结果 2. 使用 array.shift() 删除 'A' 3.调用flat(array),array现在是['B']
第三次迭代: firstElement = 'B', Array.isArray(firstElement) 为假 1. 跳下将这个元素推入结果,结果现在只有['B'],因为我在调用函数时重置了结果。 2. 使用array.shift()删除'B',数组现在是空的,->[] 3. 我怎样才能退出,并在原始输入数组上使用 flat()?
【问题讨论】:
-
为什么?只是为什么?这是一个纯粹的教学练习,在现实生活中你永远不需要这样的东西
-
@CristianTraìna 这是掌握递归的绝佳练习。
-
@CristianTraìna - 很高兴知道我不会在现实生活中使用它哈哈。我可以使用循环轻松完成此操作,但我正在尝试提高我的递归技能。它仍然摇摇欲坠。这只是练习题之一。
-
这是一个很好的练习。并且在现实生活中很有用,因为嵌套数组还可以包含更多嵌套数组,例如树。
标签: javascript arrays recursion flatten