1. let arr = [1, 2, [3, 4, [5, 6]]]
    2. // 循环递归
    3. let flatten1 = function (arr) {
    4. let ret = []
    5. for (let i=0; i<arr.length; i++) {
    6. if (Array.isArray(arr[i])) {
    7. ret = ret.concat(flatten1(arr[i]))
    8. } else {
    9. ret.push(arr[i])
    10. }
    11. }
    12. return ret
    13. }
    14. // console.log(flatten1(arr));
    15. // reduce循环递归
    16. let flatten2 = function (arr) {
    17. return arr.reduce((result, item) => {
    18. return result.concat(Array.isArray(item) ? flatten2(item) : item)
    19. }, [])
    20. }
    21. // console.log(flatten2(arr));
    22. // toString方法
    23. let flatten3 = function (arr) {
    24. return arr.toString().split(',').map(item => +item)
    25. }
    26. // console.log(flatten3(arr));
    27. // es6扩展运算符
    28. let flatten4 = function (arr) {
    29. while (arr.some(item => Array.isArray(item))) {
    30. arr = [].concat(...arr)
    31. }
    32. return arr
    33. }
    34. console.log(flatten4(arr));
    35. // es6自带
    36. function f5(arr) {
    37. return arr.flat(Infinity)
    38. }
    39. // 使用栈
    40. function f7(arr) {
    41. const stack = [...arr]
    42. const ret = []
    43. while(stack.length) {
    44. const next = stack.pop()
    45. if(Array.isArray(next)) {
    46. stack.push(...next)
    47. } else {
    48. ret.push(next)
    49. }
    50. }
    51. return ret.reverse();
    52. }
    53. // 解构运算原理,generator
    54. function* flatten(arr) {
    55. for (const item of arr) {
    56. if(Array.isArray(item)){
    57. yield* f6(item)
    58. } else {
    59. yield item
    60. }
    61. }
    62. }
    63. var arr = [1, 2, [3, 4, [5, 6]]];
    64. const flattened = [...flatten(arr)];