我试图在保留顺序的同时展平嵌套数组,例如[[1, 2], 3, [4, [[5]]]]
应转换为[1, 2, 3, 4, 5]
。
我正在尝试使用递归来执行此操作,但下面的代码不起作用,我不明白为什么。我知道还有其他方法可以做到,但我想知道这有什么问题。
function flatten (arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
flatten(arr);
} else {
newArr.push(arr[i]);
}
}
return newArr;
}
flatten([[1, 2], 3, [4, [[5]]]]);
由于
答案 0 :(得分:12)
递归调用flatten
时,需要将arr[i]
传递给它,然后使用newArr连接结果。所以替换这一行:
flatten(arr);
使用:
newArr = newArr.concat(flatten(arr[i]));
答案 1 :(得分:3)
这是我经常用于展平嵌套数组的常见模式,由于其函数式编程性质,我发现它更加干净:
var flatten = (arrayOfArrays) =>
arrayOfArrays.reduce((flattened, item) =>
flattened.concat(Array.isArray(item) ? flatten(item) : [item]), []);
对于那些喜欢较短的,不太可读的高尔夫代码版本的用户:
var flatten=a=>a.reduce((f,i)=>f.concat(Array.isArray(i)?flatten(i):[i]),[]);
答案 2 :(得分:1)
这是一些工作代码
function flatten (arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
var temp = flatten(arr[i]);
temp.forEach(function(value){ newArr.push(value); })
} else {
newArr.push(arr[i]);
}
}
return newArr;
}
答案 3 :(得分:1)
没有测试过,咬过这部分
if (Array.isArray(arr[i])) {
flatten(arr);
} else {
似乎是打算
if (Array.isArray(arr[i])) {
flatten(arr[i]);
} else {
答案 4 :(得分:0)
这个解决方案没有使用任何数组方法
//1 >> loop inside parent
//2 >> if the element is not an array then push it in array that has to be returned or else loop inside it
const arr = [[0, 1], [2, 3], [4, 5, [6, 7, [8, [9, 10]]]]]
function toFlatArray(arr) {
let flatArray = [];
function rec(a) {
if (!Array.isArray(a)) {
flatArray.push(a);
} else {
for (let i = 0; i < a.length; i++) {
rec(a[i]);
}
}
}
rec(arr);
return flatArray;
}
const flatArray = toFlatArray(arr);
console.log("flatArray", flatArray);
答案 5 :(得分:0)
易于理解的解决方案:
var flatten = function(array) {
let flatArray = [];
array.forEach(element => {
if (Array.isArray(element)) {
let inner = flatten(element);
flatArray.push(...inner)
} else {
flatArray.push(element);
}
})
return flatArray;
};