经常会遇到需要把数组展开的面试题,比如把数组['j',['a','r'],'v',['a,'n'],[5,[2,0]]]
展开变成["j", "a", "r", "v", "a", "n", 5, 2, 0]
。常见方式肯定是递归,今天发现了一种利用ES6新特性的方式,记录下来张张见识。
先写下比较常见的递归方式:
1 2 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遍历器的方式:
1 2 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新特性,值得好好深入研究,这里就先记录下,待后续深入研究下遍历器。