Javascript递归数组展平

yxf*_*xmx 13 javascript arrays recursion

我正在练习并尝试编写一个递归数组展平函数.代码在这里:

function flatten() {
    var flat = [];
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] instanceof Array) {
            flat.push(flatten(arguments[i]));
        }
        flat.push(arguments[i]);
    }
    return flat;
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我传递一个数组或嵌套数组,我得到"超出最大调用堆栈大小"错误.我究竟做错了什么?

Aru*_*hny 21

问题是你如何传递数组的处理,如果值是一个数组,那么你一直在调用它导致无限循环

function flatten() {
    var flat = [];
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] instanceof Array) {
            flat.push.apply(flat, flatten.apply(this, arguments[i]));
        } else {
            flat.push(arguments[i]);
        }
    }
    return flat;
}
Run Code Online (Sandbox Code Playgroud)

演示:小提琴

这是一个更现代的版本:

function flatten(items) {
  const flat = [];

  items.forEach(item => {
    if (Array.isArray(item)) {
      flat.push(...flatten(item));
    } else {
      flat.push(item);
    }
  });

  return flat;
}
Run Code Online (Sandbox Code Playgroud)


Gib*_*olt 9

2019 年使用ES6扁平化数组的干净方法是flat()

const array = [1, 1, [2, 2], [[3, [4], 3], 2]]

// All layers
array.flat(Infinity) // [1, 1, 2, 2, 3, 4, 3, 2]

// Varying depths
array.flat() // [1, 1, 2, 2, Array(3), 2]

array.flat(2) // [1, 1, 2, 2, 3, Array(1), 3, 2]
array.flat().flat() // [1, 1, 2, 2, 3, Array(1), 3, 2]

array.flat(3) // [1, 1, 2, 2, 3, 4, 3, 2]
array.flat().flat().flat() // [1, 1, 2, 2, 3, 4, 3, 2]
Run Code Online (Sandbox Code Playgroud)

Mozilla 文档

我可以使用吗- 92% 2020 年 12 月


小智 7

[...arr.toString().split(",")]
Run Code Online (Sandbox Code Playgroud)

使用 的toString()方法Object。使用扩展运算符(...)创建一个字符串数组并将其拆分为",".

例子:

let arr =[["1","2"],[[[3]]]]; // output : ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)

  • 这会将数字转换为字符串,并将分解包含逗号的字符串。 (5认同)

fra*_*iga 6

如果项目是数组,我们只需将所有剩余的项目添加到该数组中

function flatten(array, result) {
  if (array.length === 0) {
    return result
  }
  var head = array[0]
  var rest = array.slice(1)
  if (Array.isArray(head)) {
    return flatten(head.concat(rest), result)
  }
  result.push(head)
  return flatten(rest, result)
}

console.log(flatten([], []))
console.log(flatten([1], []))
console.log(flatten([1,2,3], []))
console.log(flatten([1,2,[3,4]], []))
console.log(flatten([1,2,[3,[4,5,6]]], []))
console.log(flatten([[1,2,3],[4,5,6]], []))
console.log(flatten([[1,2,3],[[4,5],6,7]], []))
console.log(flatten([[1,2,3],[[4,5],6,[7,8,9]]], []))
Run Code Online (Sandbox Code Playgroud)


Red*_*edu 5

一个 Haskelesque 的方法......

function flatArray([x,...xs]){
  return x !== undefined ? [...Array.isArray(x) ? flatArray(x) : [x],...flatArray(xs)]
                         : [];
}

var na = [[1,2],[3,[4,5]],[6,7,[[[8],9]]],10],
    fa = flatArray(na);
console.log(fa);
Run Code Online (Sandbox Code Playgroud)

所以我认为上面的代码片段可以通过适当的缩进更容易理解;

function flatArray([x,...xs]){
  return x !== undefined ? [ ...Array.isArray(x) ? flatArray(x)
                                                 : [x]
                           , ...flatArray(xs)
                           ]
                         : [];
}

var na = [[1,2],[3,[4,5]],[6,7,[[[8],9]]],10],
    fa = flatArray(na);
console.log(fa);
Run Code Online (Sandbox Code Playgroud)


fad*_*eel -1

您应该为递归添加停止条件。

例如,如果 len (arguments[i]) ==0 返回