Ryan Shang

生死看淡,不服就干

0%

Flat函数

经常会遇到需要把数组展开的面试题,比如把数组['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新特性,值得好好深入研究,这里就先记录下,待后续深入研究下遍历器。