一、什么是数组扁平化

  1. 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁、简单,突出主题。
  2. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层的数组。

Ps: flatten 可以使数组扁平化,效果就会如下:

const arr = [1, [2, [3, 4]]];
console.log(flatten(arr)); // [1, 2, 3, 4]

从中可以看出,使用 flatten 处理后的数组只有一层,下面我们来试着实现一下。

二、简单实现

2.1 普通递归

  • 这是最容易想到的方法,简单,清晰!
/* ES6 */
const flatten = (arr) => {
let result = [];
arr.forEach((item, i, arr) => {
if (Array.isArray(item)) {
result = result.concat(flatten(item));
} else {
result.push(arr[i])
}
})
return result;
}; const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
function flatten(arr) {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
}
else {
result.push(arr[i])
}
}
return result;
} const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

2.2 toString()

  • 该方法是利用 toString 把数组变成以逗号分隔的字符串,然后遍历数组把每一项再变回原来的类型。

先来看下 toString 是怎么把数组变成字符串的

[1, [2, 3, [4]]].toString()
// "1,2,3,4"

完整的展示

/* ES6 */
const flatten = (arr) => arr.toString().split(',').map((item) => +item); const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
function flatten(arr) {
return arr.toString().split(',').map(function(item){
return +item;
});
} const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

这种方法使用的场景却非常有限,必须数组中元素全部都是 Number

也可以全部都为 String,具体实现大家自己体会。

2.3 [].concat.apply + some

  • 利用 arr.some 判断当数组中还有数组的话,循环调用 flatten 扁平函数(利用 [].concat.apply扁平), 用 concat 连接,最终返回 arr;
/* ES6 */
const flatten = (arr) => {
while (arr.some(item => Array.isArray(item))){
arr = [].concat.apply([], arr);
}
return arr;
} const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
/**
* 封装Array.some
* @param {function} callback - 回调函数
* @param {any} currentThis - 回调函数中this指向
*/
Array.prototype.some = function (callback, currentThis){
let context = this;
let flag = false;
currentThis = currentThis || this;
for (var i = 0, len = context.length; i < len; i++) {
const res = callback.call(currentThis, context[i], i, context);
if (res) {
flag = true;
} else if (!flag) {
flag = false;
}
}
return flag;
} function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat.apply([], arr);
}
return arr;
} const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

2.4 reduce

  • reduce 本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:
function flatten(arr){
return arr.reduce(function(prev, cur){
return prev.concat(Array.isArray(cur) ? flatten(cur) : cur)
}, [])
} const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

2.5 ES6 中的 解构运算符 ...

  • ... 每次只能展开最外层的数组,被 [].concat 后,arr 就扁平化一次。
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr);
}
return arr;
} const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));

番外篇将给大家讲解 lodashflatten 的实现源码,感谢大家阅读!

最新文章

  1. Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用)
  2. 【iCore3 双核心板】例程二十三:LAN_HTTP实验——网页服务器
  3. 字符串匹配与KMP算法实现
  4. dtrace4linux_Example
  5. Makefile与shell脚本的区别
  6. IOS发展--他们控制的定义
  7. Android性能优化之被忽视的优化点
  8. Python中的 *args 和 **kwargs
  9. Mybatis框架一:搭建测试
  10. linux进程间通信同步-共享内存
  11. Kafka 处理器客户端介绍
  12. 关于开发React Native的注意事项
  13. 正余弦信号的DFT频谱分析
  14. 青蛙的约会---poj1061(扩展欧几里德)
  15. rvm 安装ruby环境报错curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
  16. Win 8下Rime输入法无法同步的临时解决方法
  17. 在angular7中创建组件/自定义指令/管道
  18. 树莓派3B+学习笔记:4、查看GPIO
  19. python 面向对象 【进阶】
  20. IntelliJ IDEA centos安装

热门文章

  1. pojcoin【未完待续】
  2. hdoj1260【简单DP】
  3. StructLayoutLayout 属性无法通过GetCustomAttributes 或者 Attributes获得
  4. AGC031 A~C
  5. springboot整合H2内存数据库,实现单元测试与数据库无关性
  6. PHP + jquery.validate remote的用法
  7. CGI、ASP、PHP、JSP、 ASP.NET网站开发语言比较
  8. 利用uiautomator实现Android移动app启动时间的测试
  9. CSS实现文字旋转/实现角标
  10. 关于重置功能(type=&quot;reset&quot;)的相关问题