博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组扁平化
阅读量:5960 次
发布时间:2019-06-19

本文共 2880 字,大约阅读时间需要 9 分钟。

转载自

一、什么是数组扁平化

  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 的实现源码,感谢大家阅读!

你可能感兴趣的文章
2013编程之美资格赛【传话游戏】
查看>>
关于Dictionary的线程安全问题
查看>>
在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
查看>>
CentOS6.5+mysql5.1源码安装过程
查看>>
Js 笔记
查看>>
C++: find()函数的注意事项
查看>>
js的事件学习笔记
查看>>
leetcode 【 Add Two Numbers 】 python 实现
查看>>
Android接收系统广播
查看>>
将网络中的图片存为NSData并保存到sqlite的BLOB字段中
查看>>
Cocos2d-js-v3.2 在 mac 上配置环境以及编译到 Andorid 的注意事项(转)
查看>>
iOS用三种途径实现一方法有多个返回值
查看>>
python--class test
查看>>
从零开始理解JAVA事件处理机制(3)
查看>>
HttpURLConnection类的使用
查看>>
linux命令分析---SED (二)
查看>>
[INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
查看>>
py2与py3差别
查看>>
欧洲语言框架A1到C2,法语等级 A1、A2、B1、B2、C1、C2
查看>>
c语言中以追加只写方式打开文本文件,C语言中打开文件读取,写入的操作
查看>>