递归展开嵌套数组

时间:2018-01-13 01:13:37

标签: javascript

我试图在函数中递归地展开嵌套数组;除了在要存储的函数之外创建一个新的空数组之外,我想不出办法。有没有办法我可以递归解包嵌套数组,同时在函数内部保留一个新的空数组?

var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];

var newArray =[];

function nestedArray(arr) {


arr = arr.forEach(function(item,index){
  if(Array.isArray(item)){
    return nestedArray(item);
  }else{

    newArray.push(item)
  }
})
return newArray
}

nestedArray(test)

5 个答案:

答案 0 :(得分:2)

从IIFE(立即调用的函数表达式)返回函数,并将newArray放在其中。 " IIFE"创造一个"关闭"或"范围" newArray和构建它的函数都可以驻留在其中:



var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];

var nestedArray = (function() {
  var newArray = [];

  return function(arr) {
    arr = arr.forEach(function(item,index){
      if(Array.isArray(item)){
        return nestedArray(item);
      }else{
        newArray.push(item)
      }
    })
    return newArray;  
  }
})();

console.log( nestedArray(test) );




答案 1 :(得分:2)

var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];

function nestedArray(oldArr, newArr) {
  newArr = newArr || []
  oldArr.forEach(function(item,index){
    if(Array.isArray(item)){
      return nestedArray(item, newArr);
    }else{
      newArr.push(item)
    }
  })
  return newArr
}

console.log(nestedArray(test))

jsbin example

答案 2 :(得分:1)

您可以随时toString()删除所有[],然后在逗号上拆分。



const array = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];
const newArray = array.toString().split(",").map(val => parseInt(val));

console.log(newArray);




答案 3 :(得分:0)

您可以使用Array#reduceArray#concat的组合进行一点递归来完成工作。基本上你迭代给定的数组,如果值是一个数组递归调用嵌套数组函数并将结果连接到累加器,或者只是将值连接到累加器数组。



var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];

const nestedArray = arr =>
  arr.reduce((acc, x) =>
    acc.concat(
      Array.isArray(x)
        ? nestedArray(x)
        : x
    )
  , [])

console.log(
  nestedArray(test)
)

<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我想出了一种不使用IIFE的方法

var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];

var nestedArray = function(arr) {
  var newArray = [];


  arr.forEach(function(item,index){
      if(Array.isArray(item)){
        var storage = nestedArray(item);
        newArray = newArray.concat(storage)
      }else{
        newArray.push(item)
      }
    })

  return newArray;  
}


nestedArray(test);

通过创建var storage,它允许我存储递归内容的结果,并且我可以将新数组的结果连接到我的旧数组。