数组扁平化是什么?
数组扁平化是指将一个多维数组转化为一维的数组。
如:
基本实现步骤:
1.对数组每一项进行遍历
2.判断该项是否是数组
3.如果该项不是数组,则将其直接放进新数组
4.是数组返回1,继续迭代
5.当数组遍历完成,返回新数组
一、递归
遍历过程中,遇到是数组的项,继续调用扁平函数对其进行迭代,直到最后不是数组的一层,将数值添加进res数组中
Array.prototype.flat = function() {
let res = [];
let len = this.length;
//遍历数组
for (let i = 0; i < len; i++) {
//判断是否是数组
if (Array.isArray(this[i])) {
//是数组调用扁平函数继续判断
res = res.concat(this[i].flat())
} else {
res.push(this[i])
}
}
return res
}
var acc = [1, 2, 3, [4, 5, 'hello', ['world', 9, 666]]]
console.log(acc.flat());
二、利用reduce函数迭代
使用reduce函数遍历数组,reduce方法第一个参数为最后累加的结果,第二个参数为遍历的当前项,对迭代到的当前项进行正则判断,分两种情况,当检测到的是普通项,则用concat添加进prev中,当是数组时,对该项执行扁平函数继续进行迭代。
const flat = (arr) => {
//第一个参数返回最后累加的结果
return arr.reduce((prev, item) => {
return prev.concat(Array.iaArray(item) ? flat(item) : item)
}, [])
}
var a = [1, 2, 3, [4, 5, 'hello', ['world', 9, 666]]]
console.log(flat(a));
三:拓展运算符实现
使用一个while循环遍历数组,利用some方法将数组中的数组项过滤出来,利用ES6展开运算符,将其拼接进原数组。
const flat = (arr) => {
while (arr.some(item => Array.isArray(item))) {
//使用some方法把数组中仍是数组的项过滤出来,执行concat操作,
//利用ES6展开运算符,将其拼接到原数组中,最后返回原数组
arr = [].concat(...arr);
}
return arr;
}
var a = [1, 2, 3, [4, 5, 'hello', ['world', 9, 666]]]
console.log(flat(a));
四:split和toString共同处理
使用toString()方法将数组中的元素全部转化为用一个逗号隔的字符串形式,用split()方法将其转化为数组。
const flat = (arr) => {
return arr.toString().split(',')
};
const a = [1, 2, 3, [2, 3],
[4, 5, [8, 9]]
]
console.log(flat(a));
五:调用ES6中的flat
Infinity表示签嵌套的字符串层数,在数组层数不确定的时候,最好直接使用Infinity
const a = [1, 2, 3, [2, 3],
[4, 5, [8, 9]]
]
const flatten = (arr) => {
return arr.flat(Infinity)
};
console.log(flatten(a));