数组的扁平化概念是指将一个多维数组变成是一个一维数组
[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]
具体实现
方法一:最常用的方法递归法:
function flatten(arr) {
var res = [];
arr.map(item => {
if(Array.isArray(item)) {
res =[] res.concat(flatten(item));
} else {
res.push(item);
}
});
return res;
}
方法二:使用es6新特性扩展运算符:
[].concat(...[1, 2, 3, [4, 5]]);
// [1, 2, 3, 4, 5]
方法三:使用reduce方法:
数组的reduce方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行,将其结果汇总称为单个返回值)
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
callback:
执行数组中的每个值(如果没有提供则第一个值除外)的函数,包括四个参数
accumulator:
累计器累计回调的返回值,她是上一次调用回调时返回的累积值
currenValue:
数组中正在处理的元素
function flatten(arr) {
return arr.reduce((result, item)=> {
return result.concat(Array.isArray(item) ? flatten(item) : item);
}, []);
}
方法四:toString & split
也就是说调用数组的toString方法,将数组变成字符串,然后再用split分割还原为数组
function flatten(arr) {
return arr.toString().split(',').map(function(item) {
return Number(item);
})
}
方法五:使用join&split
和上面的toString方法一样,join也可以将数组转换未字符串
function flatten(arr) {
return arr.join(',').split(',').map(function(item) {
return parseInt(item);
})
}
虽然数组arr,若arr[i]为数组则递归遍历,直到arr[i]不为数组然后与之前的结果concat
数组遍历,对象遍历
数组遍历的方法有很多,比如说我们常用的pop,push,shift,unshift数组还有split和slice对数组进行增删改操作
for in 语句用于对数组或者是对象的属性进行循环操作
for of 循环可以使用的范围包括数组,set和map结构,某些类似数组的对象(argument对象,Dom节点对象)
for in 可以循环遍历对象的属性,原型链上的所有属性都将被访问
同时可以遍历对象的还有Object.keys(),只遍历自身属性
缺点分析
以上的这几种解决数组扁平化的实现就只是针对的是数字,但是如果是非数字的就需要另外的方式进行数组的扁平化