展平javascript多维嵌套数组

时间:2017-02-17 07:10:33

标签: javascript

我试图压扁阵列,但我遇到了困难。

我的代码:



    var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];
    
    var res = [].concat.apply([], arr);
    
    //Using reduce(ES5)

   function test(args){
     var sum = args.reduce(function(acc, val){
       acc.concat(Array.isArray(val)? test(val): val);
     });
    }

    //Regular implementation
    function test2(arr){
      var result = [];
      arr.forEach(function(val){
        if(Array.isArray(val)){
          result = [].concat.apply([], val);
        } else {
          result.concat(val);
        }
      });
      return result;
    }
    
    console.log(test(arr));
    console.log(test2(arr));




预期产出:

["2", "3", "4","5", "6", "7"]

有人可以告诉我哪里出错了吗?

4 个答案:

答案 0 :(得分:5)

多数民众赞成。这么简单

var arr = [["2"], ["3", "4"], "5", [["6"], ["7"]]];

function test2(arr) {
    return arr.toString().split(",");
}

console.log(test2(arr));

答案 1 :(得分:4)

由于它是嵌套结构,因此您应该使用recursion

逻辑

  • 循环遍历数组并检查当前项是否为数组。
  • 如果是,请重复此过程。
  • 如果没有,请将值推送到临时数组。
  • 将每个递归的返回值合并到上一个递归值。

Array.forEach

var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];

function getFlattenArray(array){
  var _tmp = [];
  array.forEach(function(item){
    if(Array.isArray(item)) {
      _tmp = _tmp.concat(getFlattenArray(item))
    }
    else{
      _tmp.push(item);
    }
  })
  return _tmp;
}

var result = getFlattenArray(arr);

console.log(result)

Array.reduce

var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];

function getFlattenArray(array){
  return array.reduce(function(p,c){
    if(Array.isArray(c)) {
      p = p.concat(getFlattenArray(c))
    }
    else{
      p.push(c);
    }
    return p
  }, [])
}

var result = getFlattenArray(arr);

console.log(result)

ES6版本

var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];

function getFlattenArray(array){
  return array.reduce((p,c) => (Array.isArray(c) ? p=p.concat(getFlattenArray(c)) : p.push(c) ) && p, [])
}

var result = getFlattenArray(arr);

console.log(result)

答案 2 :(得分:1)

我认为我链接你的代码不起作用的原因是你可能犯了同样的错误。我相信(如果我错了,我真的不在意,有人会纠正我),箭头功能会自动返回最后一行,所以在将代码转换为ES5时你会忘记返回arr.reduce(...)

这适用于我,Windows上的Chrome。



var arr = [
  ["2"],
  ["3", "4"], "5", [
    ["6"],
    ["7"]
  ]
];

function flatten(arr) {
  return arr.reduce(function(acc, val) {
    return acc.concat(Array.isArray(val) ? flatten(val) : val);
  }, []);
}

console.log(flatten(arr));




答案 3 :(得分:1)

var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];

var flatten = arr.flat(Infinity);

console.log(flatten);

由于Array.prototype.flat()已包含在标准ECMAScript 2019(ES10)中,因此无需实现自己的方法即可展平数组。

flat方法可以使用参数来指定嵌套数组结构应展平的深度。在上面的示例中,我传递了全局范围变量Infinity,因此它展平了所有级别。

在撰写本文时(04/11/2019),除Edge以外,所有主流浏览器均已在其较新版本中实现了该功能。 Babel 7.4.0(带有core-js @ 3)也附带了。