High一下!

数组扁平化

纸上得来终觉浅,绝知此事要躬行

转眼又要开始校招了,组内也要求每人出一道题,忽然就想起自己面试遇到的一道数组扁平化的问题,就顺便温习做下总结。

题目:请使用尽可能多的方法将一个js嵌套数组转换为只有一层的数组。例如:

1
2
let  arr = [1, [2, [3, 4]]];
console.log(flatten(arr)) // [1, 2, 3, 4]

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 方法 1,常规深度遍历
let arr = [1, [2, [3, 4]]];

let flatten = (arr)=> {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (Object.prototype.toString.call(arr[i])==='[object Array]') {
result = result.concat(flatten(arr[i]))
}
else {
result.push(arr[i])
}
}
return result;
}


console.log(flatten(arr))
1
2
3
4
5
6
7
8
9
10
// 方法2 遍历,但是使用reduce简化代码
let arr = [1, [2, [3, 4]]];

let flatten = (arr)=> {
return arr.reduce(function(prev, next){
return prev.concat(Object.prototype.toString.call(next)==='[object Array]'? flatten(next) : next)
}, [])
}

console.log(flatten(arr))
1
2
3
4
5
6
7
8
9
10
11
12
// 方法3 遍历 ES6拓展运算符简化代码
let arr = [1, [2, [3, 4]]];

let flatten = (arr)=> {

while (arr.some(item => Object.prototype.toString.call(item)==='[object Array]')) {
arr = [].concat(...arr);
}
return arr;
}

console.log(flatten(arr))
1
2
3
4
5
6
7
8
// 方法4,不使用遍历, JSON.stringify转化为字符串, 正则取出内容,拼接为JSON数组,转为数组(注意转化字符串方法,toString和join会无法处理极端数据如[2, [3.2, ['s,d,w'],'a,b,c,d,e']]
let arr = [1, [2, [3, 4]]];

let flatten = (arr)=> {
return JSON.parse(`[${JSON.stringify(arr).replace(/\[|\]/g, '')}]`);
}

console.log(flatten(arr))
1
2
3
4
5
6
//方法5,不使用循环,JSON.stringify转化为字符串, 正则取出内容,拼接为JSON数组,JSON.parse转为数组
let arr = [1, [2, [3, 4]]];
let flatten = (arr)=> {
return JSON.parse(`[${JSON.stringify(arr).replace(/\[|\]/g, '')}]`);
}
console.log(flatten(arr))

考察知识点:主要考察数组方面知识

  1. 数组类型判断(typeof, Array.isArray, Object.prototype.toString.call(arr))
  2. 数组遍历方法的熟悉reduce、some、 map、concat等,ES6少许知识,以及简化代码的意识

需要说明的时后面两种不使用遍历的方·JSON.stringify,对于一些数据类型可能不太适用,这是使用时需要注意的。

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章