【问题标题】:How to get all values out of array and its sub-arrays [duplicate]如何从数组及其子数组中获取所有值[重复]
【发布时间】:2017-01-08 15:54:01
【问题描述】:

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

对于数组,它将再次执行相同的过程,直到将第一个数组、其子数组、子数组自己的子数组等中的所有值放入单个数组中.

我面临的问题在于,我事先不知道每个数组会有多少个子数组,等等。

我的尝试:

我已经尝试使用 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 中寻找后代会有所帮助,但我不确定如何设置 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"]

如何修复我当前的代码以达到上述预期结果?

【问题讨论】:

  • 我认为这个答案会解决你的问题:stackoverflow.com/a/15030117/693275
  • 它使用的是reduce(),它适用于IE9+。谢谢@RobM。
  • 查看其他一些例子(有很多)——其实是同一个问题

标签: javascript arrays


【解决方案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 ) ;

【讨论】:

  • 太棒了!谢谢@sjdalesandro。
  • @AngelPolitis 欢迎您。很高兴为您提供帮助!
【解决方案2】:

您可以使用递归 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);

【讨论】:

  • 你是 reduce(),适用于 IE9+。不过感谢您的回答。
  • 啊,之前我没有看到上面的评论。 ://
  • 好吧,既然它正在工作,它可能对将来的某人有所帮助。赞成:)
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多