如何获取数组及其子数组中的所有值

3
我正在尝试构建一个函数,该函数将应用于一个数组,并提取所有不是数组的值。对于那些是数组的值,它会再次执行同样的过程,直到来自第一个数组、其子数组、子数组自己的子数组等的所有值都被放入单个数组中。我面临的问题在于,我不会事先知道每个数组将有多少子数组等等。我尝试使用 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;
}

我认为像在 DOM 中查找后代一样使用each = each[i]会有所帮助,但我不确定如何设置while循环条件以及终止条件应该是什么。

期望的结果:

var array = [["a", 2, [3, "mn"], "bu"], "la", [12, 34, "ab"]]; // Just an example
var result = extract(array); // Outputs: ["a", 2, 3, "mn", "bu", "la", 12, 34, "ab"]

如何修改我的当前代码以实现以上所需的结果?

1
我认为这个答案会解决你的问题:https://dev59.com/cmgv5IYBdhLWcg3wD8yY#15030117 - Rob M.
它使用的是 reduce(),适用于IE9+。不过还是谢谢@RobM。 - Angel Politis
检查一些其他的例子(有很多)- 这实际上是同一个问题。 - Rob M.
2个回答

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 ) ;


太好了!谢谢 @sjdalessandro。 - Angel Politis
@AngelPolitis 不用谢。很高兴能帮忙! - user6558785

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);


你使用的是IE9+才支持的 reduce() 方法。感谢你的回答。 - Angel Politis
啊,我在进行这个操作之前没有看到上面的评论。 :/ - KevBot
既然它能正常工作,将来可能对某些人有所帮助。已点赞 :) - Angel Politis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接