概念
数组扁平化是指将一个多维数组变为一维数组
实现方法
- reduce
- toString & split
- join & split
- 递归
- 扩展运算符
定义一个多维变量
let arry = [1,[4,5,6],[7,8,[9,10]]];
1. reduce方法实现
遍历数组每一项,若值为数组则递归遍历,否则concat。
reduce 语法
arr.reduce(function(prev,cur,index,arr){
...
}, init);
其中,
arr 表示原数组;
prev 表示上一次调用回调时的返回值,或者初始值 init;
cur 表示当前正在处理的数组元素;
index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
init 表示初始值。
reduce是数组的一种方法,它接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce包含两个参数:回调函数,传给total的初始值
// 求数组的各项值相加的和:
arr.reduce((total, item)=> { // total为之前的计算结果,item为数组的各项值
return total + item;
}, 0);
reduce 扁平化实现
function reduce(arr){
return arr.reduce(function(prev,cur,index,arr){
return prev.concat(Array.isArray(cur)?reduce(cur):cur);
},[])
}
console.log(reduce(arry))//[1, 4, 5, 6, 7, 8, 9, 10]
2. toString & split
调用数组的toString方法,将数组变为字符串然后再用split分割还原为数组
function reduce(arry){
return arry.toString().split(",").map(function(item){
return Number(item)
})
}
console.log(reduce(arry))//[1, 4, 5, 6, 7, 8, 9, 10]
因为split分割后形成的数组的每一项值为字符串,如果源数组是数字类型的,那么需要使用map进行转换成数值型
3. join and split
join也可以将数组转换为字符串
function reduce(arry){
return arry.join(",").split(",").map(item=>Number(item))
}
console.log(reduce(arry))//[1, 4, 5, 6, 7, 8, 9, 10]
4. 递归
递归的遍历每一项,若为数组则继续遍历,否则concat
function reduce(arry){
let res = [];
arry.map(item=>{
if(Array.isArray(item)){
res = res.concat(reduce(item))
}else{
res.push(item);
}
})
return res;
}
console.log(reduce(arry))//[1, 4, 5, 6, 7, 8, 9, 10]
5.扩展运算符
es6的扩展运算符能将二维数组变为一维
let result = [].concat(...[1, 2, 3, [4, 5]]);
console.log(result)
// [1, 2, 3, 4, 5]
let result = [].concat(...arry)
console.log(result)//[1, 4, 5, 6, 7, 8, Array(2)]
注意 :扩展运算符只能运用二维数组,根据这个结果我们可以做一个遍历,若arr中含有数组则使用一次扩展运算符,直至没有为止。
Array.some用法
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。
array.some(function(currentValue,index,arr),thisValue)
具体方法实现
function reduce(arr) {
while(arr.some(item=>Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
总结
虽然说写了5种方法,核心只有一个:
遍历数组arr,若arr[i]为数组则递归遍历,直至arr[i]不为数组然后与之前的结果concat。