请解释为什么是第二个循环。如果没有它,那么只有数组进入res,但根据我的逻辑,那里应该有值。此外,如果它不是一个数组,但例如res最初将是一个字符串,那么它是到达那里的值,如第二个示例所示。我的手往下。
let a = [[[2]], [2], [[3]], [4]];
function flatten(array) {
const res = [];
for (let i = 0; i < array.length; i++) {
if (Array.isArray(array[i])) {
const flat = flatten(array[i]);
for (let j = 0; j < flat.length; j++) {
res.push(flat[j]);
}
} else {
res.push(array[i]);
}
}
return res;
}
console.log(flatten(a));
let a = [[[2]], [2], [[3]], [4]];
function fn(arg) {
let res = '';
for (let i = 0; i < arg.length; i++) {
if (Array.isArray(arg[i])) {
let y = fn(arg[i]);
res+=(y);
} else {
res+=(arg[i]);
}
}
return res;
}
console.log(fn(a));
我会尝试:为方便起见,我用数字标记了递归的不同阶段
我们有一个包含元素的数组:
let a = [[[2, 3, 7]], [2], [[3]], [4]];假设我们遵循递归并往下走。在这里,我们来到了数组
[[2, 3, 7]]。通过函数,我们沿着路径 1 - 2 - 3 - 5 前进。
更详细地考虑路径 1 - 2 - 3 以了解为什么我们需要另一个循环:
[[2, 3, 7]]数组中是否还有另一个数组[2, 3, 7]。res)。[2, 3, 7]每个数组元素不是嵌套数组。res我们从 中推送所有元素[2, 3, 7]。那些。将返回一个数组[2, 3, 7]**[2, 3, 7]并将其所有元素推入res. 这里需要注意的是,我们已经返回并向上爬了一步,res数组中可能已经有其他元素,除了我们添加到其中的元素。现在让我们记住原始数组[[2, 3, 7]]是另一个数组的一部分。为什么需要第二个周期?是的,所以如果我们有另一个数组而不是数组中的一个元素,我们会将它逐个元素地填充到res中,并继续res添加其他不是数组的元素。为什么在第二个示例中不是这种情况?因为在第一个例子中,我们返回了一个元素数组,
[2, 3 ,7]我们一个一个地迭代它,并将它添加到最后一个。在第二个例子中,不需要遍历字符串,使用加法就足够了。如果你想让第一个选项看起来像带有字符串的第二个选项,你可以使用
spread操作符: