下面是一个基本上接受多维数组并将其转换为一维数组的函数。我正在使用递归来解决这个问题。另外,还有一个限制 - 我无法使用全局变量,因此不能在函数外部定义任何变量。
这是函数。
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。
最佳答案
您可以传递累加器:
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
和内置Array.isArray
:
function flatten(xs) {
return xs.reduce(function(acc, x) {
return acc.concat(Array.isArray(x) ? flatten(x) : x)
},[])
}
关于javascript - 如何创建递归函数并维护局部变量的历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26566233/