【问题标题】:Flatten nested arrays using recursion in JavaScript在 JavaScript 中使用递归展平嵌套数组
【发布时间】:2015-08-15 10:26:43
【问题描述】:

我试图在保持顺序的同时展平嵌套数组,例如[[1, 2], 3, [4, [[5]]]] 应转换为 [1, 2, 3, 4, 5]。

我正在尝试使用递归来做到这一点,但下面的代码不起作用,我不明白为什么。我知道还有其他方法可以做到这一点,但我想知道这有什么问题。

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

flatten([[1, 2], 3, [4, [[5]]]]);

谢谢

【问题讨论】:

  • 什么是压路机功能?
  • 抱歉,这是 freecodecamp 的挑战之一,我将名称更改为更具描述性的名称,但我忘记了。但这不是问题。
  • 在this stackoverflow page中查看我的数组展平的递归版本

标签: javascript recursion


【解决方案1】:

当递归调用flatten 时,需要将arr[i] 传递给它,然后将结果与newArr 连接起来。所以替换这一行:

flatten(arr);

与:

newArr = newArr.concat(flatten(arr[i]));

【讨论】:

    【解决方案2】:

    这是我经常用于展平嵌套数组的一种常见模式,由于它的函数式编程性质,我发现它更简洁:

    var flatten = (arrayOfArrays) =>
        arrayOfArrays.reduce((flattened, item) =>
            flattened.concat(Array.isArray(item) ? flatten(item) : [item]), []);
    

    或者对于那些喜欢较短、可读性较差的代码高尔夫版本的人来说:

    var flatten=a=>a.reduce((f,i)=>f.concat(Array.isArray(i)?flatten(i):[i]),[]);
    

    【讨论】:

    • 行 Array.isArray(item) ? flatten(item) : [item]: [item] 应该是 item => Array.isArray(item) ? flatten(item) : item
    【解决方案3】:

    这是一些工作代码

    function flatten (arr) {
      var newArr = [];
      for (var i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
          var temp = flatten(arr[i]);
          temp.forEach(function(value){ newArr.push(value); })
        } else {
          newArr.push(arr[i]);
        }
      }
      return newArr;
    }

    【讨论】:

      【解决方案4】:

      没测试过,咬一下这部分

      if (Array.isArray(arr[i])) {
            flatten(arr);
          } else {
      

      似乎是

      if (Array.isArray(arr[i])) {
        flatten(arr[i]);
      } else {
      

      【讨论】:

      • 区别在哪里?
      • @Bergi 的不同之处在于传递 [i] 而不是 a。但是这里缺少一件事 - 正如 OrenD 提到的那样,结果的串联
      • 啊,您应该在回答中明确说明这一点。我只发现了改变的缩进。
      【解决方案5】:

      这个解决方案没有使用任何数组方法

      //1 >> loop inside parent
      //2 >> if the element is not an array then push it in array that has to be returned or else loop inside it
      
      const arr = [[0, 1], [2, 3], [4, 5, [6, 7, [8, [9, 10]]]]]
      
      function toFlatArray(arr) {
        let flatArray = [];
        function rec(a) {
          if (!Array.isArray(a)) {
            flatArray.push(a);
          } else {
            for (let i = 0; i < a.length; i++) {
              rec(a[i]);
            }
          }
        }
        rec(arr);
        return flatArray;
      }
      
      
      
      const flatArray = toFlatArray(arr);
      
      console.log("flatArray", flatArray);
      

      【讨论】:

      • ..此解决方案不使用任何数组方法...请说明您的答案与其他人相比有什么好处
      【解决方案6】:

      易于理解的解决方案:

      var flatten = function(array) {
          let flatArray = [];
        
        array.forEach(element => {
          if (Array.isArray(element)) {
            let inner = flatten(element);
            flatArray.push(...inner)
          } else {
              flatArray.push(element);
          }
        })
        
        return flatArray;
      };
      

      【讨论】:

        【解决方案7】:

        递归解决方案!

        
        let newArray = [];
        function arrayFlat(array){
            for(let i = 0; i< array.length; i++){
                if(!array[i].length) { newArray.push(array[i])};
                arrayFlat(array[i]);
            }
            console.log(newArray);
        }
        
        arrayFlat(arrayData);
        
        // Array to be flattened.
        arrayData = [1,2,[3,4],[[5,6],7]];
        
        

        【讨论】:

          猜你喜欢
          • 2018-11-13
          • 1970-01-01
          • 2015-02-02
          • 2018-04-20
          • 2015-07-14
          • 2019-07-04
          • 2018-06-24
          • 1970-01-01
          • 2015-01-28
          相关资源
          最近更新 更多