当前位置: 首页 > 知识库问答 >
问题:

如何从数组及其子数组中获取所有值[重复]

谭飞掣
2023-03-14

我正在尝试构建一个函数,该函数将应用于一个数组,并将提取其所有非数组的值。

对于那些是数组的数组,它将再次执行相同的过程,直到来自第一个数组、其子数组、子数组自己的子数组等的所有值都将被放入单个数组。

我面临的问题在于,我事先不知道每个阵列将有多少子阵列,以此类推。

我尝试过的:

我尝试过使用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中寻找后代一样会有所帮助,但是我不确定在这种情况下如何设置循环以及终止条件应该是什么。

预期结果:

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"]

如何修复当前代码以实现上述预期结果?

共有2个答案

郑帅
2023-03-14

使用递归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);
百里飞捷
2023-03-14

递归的解决方案

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 ) ;
 类似资料:
  • 问题内容: 我有并想要一些函数,调用的结果是新数组。 问题答案: 看一眼

  • 如果条件匹配,我想从多数组中获取变量的特定值。 打印阵列时: 给出如下数组: 如果ID与21匹配,我正在尝试获取客户号码

  • 我有以下数组 我想从这个数组中得到唯一的值。所以我希望我的结果是这样的 我使用了数组唯一函数,但无法得到结果 如果我有两个索引,这是有效的,但是对于多个索引呢?

  • 我肯定这是以前问过的,如果重复,对不起。假设我有以下数据框: 在“key”上执行groupby,我知道我们可以执行以下操作: 获取数组中所有'拆分'数据的最简单方法是什么?: 我不一定只按一个键进行分组,而是使用其他几个索引(例如“年”和“月”),这就是为什么我想使用groupby函数,但保留数组中所有分组的值。

  • 我想获得表中所有的所有内部文本的数组。 以下工作 只是想知道在直接jQuery中是否有更好的方法(wo必须转换为数组,然后使用JS方法)

  • 我想从这个代码中得到的数组中得到一个特定的数组数据: 结果是: 数组(1){[“用户”]= 我想得到的是用户名值,我尝试过这样的解决方案: 但它给了我这样的错误: 正在尝试获取非对象的属性“username” 如何解决这个问题?谢谢你的关注。