经常会遇到需要把数组展开的面试题,比如把数组['j',['a','r'],'v',['a,'n'],[5,[2,0]]]展开变成["j", "a", "r", "v", "a", "n", 5, 2, 0]。常见方式肯定是递归,今天发现了一种利用ES6新特性的方式,记录下来张张见识。
先写下比较常见的递归方式:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | let flat1 = (arr) => {let res = []
 let flat = (target) => {
 if (target instanceof Array) {
 target.forEach(item => {
 flat(item);
 })
 } else {
 res.push(target);
 }
 }
 flat(arr);
 return res
 };
 
 | 
接着是利用ES6遍历器的方式:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 | let flat2 = (arr) => {Array.prototype[Symbol.iterator] = function () {
 let arr = [].concat(this);
 let getFirst = (array) => {
 let first = array.shift();
 if (first instanceof Array) {
 if (first.length > 1) {
 arr = first.slice(1).concat(array);
 }
 first = first[0];
 }
 return first;
 };
 return {
 next: function () {
 let item = getFirst(arr);
 if (item !== undefined) {
 return {
 value: item,
 done: false
 };
 } else {
 return {
 done: true
 };
 }
 }
 };
 };
 let res = [];
 for (let i of arr) { res.push(i); }
 return res;
 };
 
 | 
这种方式就比较惊艳,充分利用ES6新特性,值得好好深入研究,这里就先记录下,待后续深入研究下遍历器。