数组扁平化
普通的递归
var a = [1, [2, [3, 4, 5]]];
function flatten(arr){
let res=[];
for(let i=0;i<arr.length;i++){
if(Array.isArray(arr[i])){
res=res.concat(flatten(arr[i]))
}else{
res.push(arr[i])
}
}
return res
}
flatten(a) //[1, 2, 3, 4, 5]
reduce函数迭代
var arr = [1, [2, [3, 4]]];
function flatten(arr){
return arr.reduce(function(prev,next){
return prev.concat(Array.isArray(next) ? flatten(next) :next)
},[])
}
flatten(arr) //[1,2,3,4]
扩展运算符
var arr = [1, [2, [3, 4]]];
function flatten(arr){
while(arr.some(item=>Array.isArray(item))){
arr=[].concat(...arr)
}
return arr
}
flatten(arr) //[1, 2, 3, 4]
数组的方法:some
-
some()方法用于检测数组中的元素是否满足指定条件(函数提供),会依次执行数组中的每一个元素。
-
some()不会检测空数组,不会改变原始数组(和map类似)
-
语法:arr.some(function(currentValue,index,arr){})
- currentValue:必须,当前元素的值;index:可选,当前元素的索引值;arr:可选,当前元素属于的数组对象
- 返回值:
Boolean
,数组中有元素满足条件返回true,否则返回false
var arr=[1,2,3] arr.some(item=>{return item >1}) //true arr.some(item=>{return item >3}) //false
split和toString共同处理
var arr = [1, [2, [3, 4]]];
function flatten(arr){
return arr.toString().split(',')
}
flatten(arr) //["1", "2", "3", "4"]
调用ES6的flat
var arr = [1, [2, [3, 4]]];
function flatten(arr){
return arr.flat(Infinity)
}
flatten(arr) //[1, 2, 3, 4]
ES6的flat方法
- 语法:arr.flat([depth])
- depth:表示可以传递数组的深度(默认不填,数值是1);也可以天Infinity,代表无论多少层都能展开
正则和JSON方法共同处理
let arr = [1, [2, [3, [4, 5]]], 6];
function flatten(arr) {
let str = JSON.stringify(arr);
str = str.replace(/(\[|\])/g, '');
str = '[' + str + ']';
return JSON.parse(str);
}
flatten(arr) // [1, 2, 3, 4, 5, 6]