递归解包嵌套数组



>但是,我正在尝试在函数中递归地解开嵌套数组的包装;除了在要存储的函数之外创建一个新的空数组之外,我想不出一种方法。有没有办法递归解开嵌套数组,同时在函数中保留一个新的空数组?

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)

从 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) );

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 示例

您可以随时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);

您可以使用 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>

我想出了一种不使用 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,它允许我存储递归的结果,并且可以将新数组的结果连接到旧数组。

最新更新