数组扁平化
扁平化就是将嵌套的数组变成一维数组的过程
1.迭代递归
flatten(arr)
function flatten(arr, result = []) {
for (let item of arr) {
if (Array.isArray(item)) //item是数组继续迭代
flatten(item, result)
else
result.push(item) //item不是数组插入result中
}
return result
}
2.生成器实现
//迭代当前数组,如果值也是数组则生成扁平化的值,否则直接生成值。
function* flat(arr) {
for (let item of arr) {
if (Array.isArray(item))
yield* flat(item)
else
yield item
}
}
//在扁平化函数里调用这个生成器函数得到我们的一维数组。
function flatten(arr) {
let result = []
for (let val of flat(arr)) {
result.push(val)
}
return result
}
NOTE
- 嵌套 yield 需要再加一个星号,这被称为生成器委托。
- 不能使用 forEach 代替 for…of 但可以用 for 循环,因为 for 循环和for…of 可以中断迭代去执行 yield,forEach 不行
3.reduce 三句实现法
function flatten(arr) {
return arr.reduce((flat, toFlatten) => {
return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
}, []);
}
4.降维打击
转成字符串,之后再复原成数组
function flatten(arr){
return arr.toString().split(',')
}
数组去重
- set数据去重,form转换数组
- ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
- Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like
object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。
Array.from(new Set(newArr1))
- 数组reduce方法
利用indexOf判断上一次回调返回数组a中是否包含当前元素b的索引;
如果不存在,则把b元素加入a数组,否则直接返回a。
var duplicate1 = newArr1.reduce((a, b) => {
if(a.indexOf(b) === -1) {
a.push(b)
}
return a
}, [])
3.数组下标去重
数组的过滤filter方法,利用indexOf获取当前元素ele在被过滤数组farr中的第一个索引值,如果值与当前索引值index相等则返回,如果不相等则过滤。
var duplicate2 = newArr1.filter((ele, index, farr) => {
return farr.indexOf(ele) === index
})
4.遍历数组
遍历数组,建立新数组,利用indexOf判断元素是否存在于新数组中,不存在则push到新数组。
var duplicate3 = []
for(var i = 0; i < newArr1.length; i++) {
if(duplicate3.indexOf(newArr1[i]) === -1) {
duplicate3.push(newArr1[i])
}
}