数组扁平化

题目描述

给定一个数组

let array = [1,2,[3,[4],{name:'a'},[5,6]],{name:'a'},7,8]
1

需要实现一个flat()方法,将多维数组变为一维数组,对于上面的例子, 返回结果应该是[1,2,3,4,{name:'a'},5,6,{name:'a'},7,8]

##方法一 递归 一看到这种层数不定的东西,首先就想到递归,思路也很简单,遍历 数组,内部item只要不是数组的必然不需要继续操作,直接push到 result里就可以,对于item是数组的,既然我们的方法就是拍平数组, 那直接丢到flat()方法里去不就可以了吗?

然后将返回值加入result即可。

function flatArr(arr) {
    var result=[]
    for (let i = 0; i < arr.length; i++) {
        let item=arr[i]
        if (item instanceof Array) {
            let tmp = flatArr(item)
            for (let j = 0; j < tmp.length; j++) {
                result.push(tmp[j])
            }
        }else{
            result.push(item)
        }
    }
    return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

方法二 字符串操作

跟朋友聊这个问题的时候,朋友提出了一个有趣的想法: 我可不可以把他字符串里的所有方括号去掉,不就是我要的结果了吗

听起来不错哦!其实逻辑就是我的结果和去掉方括号后的字符串, 一起toString()的话,结果一致

result.toString() === str.toString() //true

但是马上我就想到一个问题:如果我的数组里出现了含有方括号的字符串 怎么办?或者某个对象的键含有方括号?

这些东西不该删掉啊。

于是想了个点子: 使用一个flag=true,遇到第一个引号时置为false,此时遇到的所有方括号 都不进行任何操作,遇到下一个引号时flag=true

思路大概就是:遍历JSON.stringify()得到的字符串, 删掉应该删的方括号,然后再用JSON.parse()将字符串还原回数组。

不过想到单双引号的事,觉得还是挺麻烦。 于是我做了个实验:

var obj={
    '[':"]"
}
JSON.stringify(obj) //"{"[":"]"}"
var obj={
    '[':"']'"
}
JSON.stringify(obj) //"{"[":"']'"}"
var obj={
    '[':'"]"'
}
JSON.stringify(obj) //"{"[":"\"]\""}"
1
2
3
4
5
6
7
8
9
10
11
12

可以看出,只要不是单引号包裹双引号的情况, 变成字符串后都是双引号; 如果是单引号包裹双引号,变成字符串后双引号前会有转义符。

以上讨论的目的是确定到底什么时候改变之前提到的flag

时间有限,代码待完成。