Javascript 如何在维护局部变量的历史记录的同时创建递归函数?
下面是一个函数,它基本上接受多维数组并将其转换为一维数组。我用递归来解决这个问题。此外,还有一个约束-我不能使用全局变量,因此不能在函数之外定义任何变量Javascript 如何在维护局部变量的历史记录的同时创建递归函数?,javascript,arrays,recursion,Javascript,Arrays,Recursion,下面是一个函数,它基本上接受多维数组并将其转换为一维数组。我用递归来解决这个问题。此外,还有一个约束-我不能使用全局变量,因此不能在函数之外定义任何变量 function flattenArray(someArr) { var results = []; if(isArrayLike(someArr)) { for(var i = 0; i != someArr.length; i++) { flattenArray(someArr[i])
function flattenArray(someArr) {
var results = [];
if(isArrayLike(someArr)) {
for(var i = 0; i != someArr.length; i++) {
flattenArray(someArr[i])
}
} else {
results.push(someArr);
}
return results;
}
下面是函数
function flattenArray(someArr) {
var results = [];
if(isArrayLike(someArr)) {
for(var i = 0; i != someArr.length; i++) {
flattenArray(someArr[i])
}
} else {
results.push(someArr);
}
return results;
}
这里,函数总是返回一个空白数组,因为每次函数递归时,它都会清除数组。那么,在不使用全局变量的情况下,如何避免这种情况呢
假设:isArrayLike()函数返回true或false。为什么不尝试将数组作为第二个参数传递给函数,最初为空数组
展平数组(someArr,result),然后在每次递归时传递更新的和最新的结果数组您可以传递累加器:
function flattenArray(someArr, acc) {
acc = acc || [];
if (isArrayLike(someArr)) {
for(var i = 0; i != someArr.length; i++) {
flattenArray(someArr[i], acc)
}
} else {
acc.push(someArr);
}
return acc;
}
或者不使用循环,使用reduce
和内置数组。isArray
:
function flatten(xs) {
return xs.reduce(function(acc, x) {
return acc.concat(Array.isArray(x) ? flatten(x) : x)
},[])
}
好的,基本上您对
flattarray
调用的返回值不做任何处理。