我正在尝试构建一个将应用于数组的函数,并将提取所有非数组的值。
对于那些是数组的,它将再次执行相同的过程,直到来自第一个数组,其子数组,子数组自己的子数组等的所有值将被放入单个数组中
我面临的问题在于事先我不知道每个阵列会有多少个子阵列等等。
我尝试了什么:
我尝试使用 forEach()
,如下所示,但正如我上面所述,子阵列的数量和一般的值事先未知。我确信某种循环或甚至递归会有所帮助,但我不能让它在我的脑海中起作用。
function extract (value) {
var
result = [],
isArray = function (value) {
return value.constructor === Array;
}
if (isArray(value)) {
value.forEach(function (each) {
if (!isArray(each)) result.push(each);
else {
each.forEach(function (j) {
if (!isArray(each)) result.push(each);
else... // same as above
});
}
});
}
return result;
}
我相信使用 each = each[i]
就像我在DOM中寻找后代一样会有所帮助,但我不确定如何设置 {{1}在这种情况下循环以及终止条件应该是什么。
期望的结果:
while
如何修复当前代码以获得上述所需的结果?
答案 0 :(得分:1)
递归的解决方案:
function extract( array, newarray ){
if( !newarray ) newarray = [] ;
if( array ) for( var i = 0 ; i < array.length ; ++i )
{
if( array[i].constructor.name === "Array" ) extract( array[i], newarray ) ;
else newarray.push( array[i] ) ;
}
return newarray ;
}
var array = [["a", 2, [3, "mn"], "bu"], "la", [12, 34, "ab"]]; // Just an
var newarray = extract(array); // Outputs: ["a", 2, 3, "mn", "bu", "la", 12, 34, "ab"]
console.log( newarray ) ;
答案 1 :(得分:1)
您可以使用递归reduce函数非常简单地完成此操作。
function flatten(arr) {
return arr.reduce(function(a, b) {
return a.concat(Array.isArray(b) ? flatten(b) : b);
}, []);
}
var arr = [["a", 2, [3, "mn"], "bu"], "la", [12, 34, "ab"]];
var result = flatten(arr);
console.log(result);