# flat 实现
flat()
方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回
| const arr1 = [1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]] |
| const arr2 = [1, 2, {}, [3, 4, [5, {}, ['abc']]]] |
| |
| arr1.flat(Infinity) |
| arr2.flat(Infinity) |
# toString 实现
toString()
方法返回一个表示该对象的字符串。
- 也可以用来扁平化,但是只针对基本数据类型
| const arr1 = [1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]] |
| const arr2 = [1, 2, {}, [3, 4, [5, {}, ['abc']]]] |
| |
| arr1.toString().split(',') |
| |
| |
| arr2.toString().split(',') |
| |
| |
| arr2.toString().split(',').map(item => +item) |
# join 实现
| const arr1 = [1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]] |
| const arr2 = [1, 2, {age: 16}, [3, 4, [5, {}, ['abc']]]] |
| |
| arr1.join('|').split(/(?:,|\|)/g).map(item => +item) |
| |
| |
| arr2.join('|').split(/(?:,|\|)/g) |
| |
| |
| arr2.join('|').split(/(?:,|\|)/g).map(item => +item) |
# JSON.stringify 实现
JSON.stringify
是可以实现扁平化的, 但是最后要转换成原来的类型是比较麻烦的
| const arr1 = [1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]] |
| const arr2 = [1, 2, {age: 16}, [3, 4, [5, {}, ['abc']]]] |
| |
| |
| JSON.stringify(arr1).replace(/(\[|\])/g, '').split(',').map(item => +item) |
| |
| |
| JSON.stringify(arr2).replace(/(\[|\])/g, '').split(',') |
# for 循环递归 实现
# 函数递归
| function flat(val, newArr = []) { |
| for (let i = 0; i < val.length; i++) { |
| if (!Array.isArray(val[i])) newArr.push(val[i]) |
| else flat(val[i], newArr) |
| } |
| return newArr |
| } |
| const arr1 = [1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]] |
| const arr2 = [1, 2, { age: 16 }, [3, 4, [5, {}, ['abc']]], [6, 7]] |
| |
| flat(arr1) |
| flat(arr2) |
# 闭包递归
- 使用闭包形式递归实现扁平化
- 这里说几个函数前面符号的意思
!
对返回值的真假取反
+ 、-
是对返回值进行数学运算
~
按位非运算符,反转操作数的位,对返回值进行按位取反
;
是为了防止代码压缩时,前面代码没写 ;
造成报错。
- 在函数前面加这些或者在括号中,那么此函数就变成了函数表达式,函数表达式就可以立即执行
| |
| ~ function () { |
| function flat() { |
| const result = [] |
| const fn = (arr) => { |
| for (let i = 0; i < arr.length; i++) { |
| if (!Array.isArray(arr[i])) result.push(arr[i]) |
| else fn(arr[i]) |
| } |
| } |
| fn(this) |
| return result |
| } |
| Array.prototype.flat = flat |
| }() |
| const arr1 = [1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]] |
| const arr2 = [1, 2, { age: 16 }, [3, 4, [5, {}, ['abc']]], [6, 7]] |
| |
| arr1.flat() |
| arr2.flat() |
# while & some 实现
| function flat(val) { |
| while (val.some(item => Array.isArray(item))) |
| val = [].concat(...val) |
| return val |
| } |
| const arr1 = [1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]] |
| const arr2 = [1, 2, { age: 16 }, [3, 4, [5, {}, ['abc']]]] |
| |
| flat(arr1) |
| flat(arr2) |