第一次发帖。抱歉格式不正确。我想让我的功能发挥作用。当前的问题是,一旦为第一个数组元素调用递归函数,递归就会停止。我需要它在调用数组后继续运行。
TLDR:我想要压扁数组。
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)
你有两个问题。
您正在混合两种输出方式。一方面,看起来你的函数返回值。但另一方面,看起来最终输出应该来自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;
您不能使用i
或var
声明您的计数器变量let
。这意味着它没有功能范围但实际上是全局范围的成员,例如浏览器中的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;
}
完美无缺。
答案 1 :(得分:0)
主要问题在于循环内部的return语句。 The return statement exits your for loop。
如果您的主要目的是展平数组,最好使用像lodash或ramda这样的实用程序库,其中展平只是:
R.flatten([1, 2, [2, 3], 2, [[[4]]]])