数组扁平化
题目描述
给定一个数组
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
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
2
3
4
5
6
7
8
9
10
11
12
可以看出,只要不是单引号包裹双引号的情况, 变成字符串后都是双引号; 如果是单引号包裹双引号,变成字符串后双引号前会有转义符。
以上讨论的目的是确定到底什么时候改变之前提到的flag。
时间有限,代码待完成。