【问题标题】:Transform Javascript subArrays into one Array [duplicate]将Javascript子数组转换为一个数组[重复]
【发布时间】:2014-05-20 03:52:43
【问题描述】:

我有这个数组:

array = ['bla', ['ble', 'bli'], 'blo', ['blu']]

我希望它是

array = ['bla', 'ble', 'bli', 'blo', 'blu']

有没有一个简单的函数可以给我这个特定的结果?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    2020 年更新:

    您现在可以在几乎所有现代浏览器中使用.flat()(IE 是一个例外)。

    var newArray = arr.flat([depth])

    let result = ['bla', ['ble', 'bli'], 'blo', ['blu']].flat()
    console.log(result);
    result = ['bla', ['ble', ['bli', ['bom']]], 'blo', ['blu']].flat()
    console.log(result);
    result = ['bla', ['ble', ['bli', ['bom']]], 'blo', ['blu']].flat(2)
    console.log(result);
    result = ['bla', ['ble', ['bli', ['bom']]], 'blo', ['blu']].flat(Infinity)
    console.log(result);

    您可以使用concat 来执行此操作:

    array = [].concat.apply([], array)
    

    如果您需要递归执行(嵌套嵌套数组),我可能会这样做:

    function flatten(arr, result) {
        if (typeof result === "undefined") {
            result = [];
        }
        for (var i = 0; i < length; i++) {
            if (Array.isArray(arr[i])) {
                flatten(arr[i], result);
            } else {
                result.push(arr[i]);
            }
        }
        return result;
    }
    

    【讨论】:

    • +1 但这仅适用于嵌套一层深的数组。例如['bla', ['ble', ['bli']], 'blo', ['blu']] 产生 ['bla', 'ble', ['bli'], 'blo', 'blu']
    【解决方案2】:

    有一个名为 flat 的新数组原型函数。目前,微软浏览器和三星互联网不支持此功能。语法很简单:

    array.flat([depth])
    

    depth 是一个可选变量,用于指定要展平的层数。默认值为 1。阅读更多信息here

    【讨论】:

      【解决方案3】:

      编辑:请查看 Dave 的答案或 p.s.w.g 的答案 - 它们更胜一筹。这段代码太可怕了,不应该使用(我无法删除已接受的答案)。

      你可以这样做:

      var arr = ['bla', ['ble', 'bli'], 'blo', ['blu']];
      var newArr = arr.toString().split(',');
      

      Demo

      解释:

      这很简单。 toString() 在包含数组的数组上创建一个字符串,其中所有元素都位于顶层,因此[['abc']].toString() 无论数组有多“深”都会产生“abc”。之后,您只需使用String.prototype.split 将输入的字符串拆分为一个数组,您就完成了目标

      【讨论】:

      • 拆分的问题是,如果内容是不同的类型,您会丢失该类型。 AKA 数字最终会变成字符串。
      • 如果字符串中有逗号,则不起作用
      • 这两点都很好。 @dave 你的回答似乎更胜一筹。
      【解决方案4】:

      已经提供的其他答案很好,但这是我的递归方法的实现,它将任意嵌套到任何深度的数组展平:

      var flatten = function(arr) {
          var out = [];
          for(var i = 0; i < arr.length; i++) {
              out.push.apply(out, Array.isArray(arr[i]) ? flatten(arr[i]) : [ arr[i] ]);
          }
      
          return out;
      };
      

      Demonstration

      请注意,这依赖于 Array.isArray,它在旧版浏览器中可能不可用。如果这是一个问题,您可以用另一个数组测试替换它(例如arr[i].constructor == Array

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-27
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 2016-08-15
        • 2015-08-04
        • 2016-09-13
        相关资源
        最近更新 更多