数组拍平(二)
编写一个 JavaScript generator 函数,接受一个仅包含数字的多维数组,返回一个迭代器,可以遍历得到它拍平以后的结果。例如:
const numbers = flatten2([1, [[2], 3, 4], 5])
numbers.next().value // => 1
numbers.next().value // => 2
numbers.next().value // => 3
numbers.next().value // => 4
numbers.next().value // => 5
此时还不知道 ES6 的 Generator,以为是自己写一个,于是有了
function flatten2 (arr) {
var results = [],
cursor = 0;
entryArray(arr);
// 递归遍历数组
function entryArray(arr){
if( typeof arr == "number" ){
results.push(arr);
}else{
for( index in arr ){
entryArray( arr[index] );
}
}
}
return {
next: function(){
return {
value: results[ cursor++ % results.length ]
};
}
};
}
提交之后总提示:你的结果有多余的迭代内容
看了一下他人的答案,发现都有一个关键字 yield
原来是使用 ES6 中的 Generator 函数,于是又有了
function *flatten2(arr){
entryArray(arr);
function entryArray(arr){
if( typeof arr == "number" ){
yield arr;
}else{
for( index in arr ){
entryArray( arr[index] );
}
}
}
}
这次就更尴尬了,报的 Compile Error
原来 yield
不能写在内部函数里,仔细一想也想得通
所以,在下的笨方法就成了
function *flatten2(arr){
var results = [];
entryArray(arr);
function entryArray(arr){
if( typeof arr == "number" ){
results.push( arr );
}else{
for( index in arr ){
entryArray( arr[index] );
}
}
}
for( index in results ){
yield results[index];
}
}
来自 ScriptOJ 中陈小俊的回答超短的解法
function *flatten2(arr){
arr = arr.length ? arr.toString().split(",").map(x => Number.parseInt(x)) : [];
for( index in arr ){
yield arr[index];
}
}
很好的使用了 Array.toString() 再 split() 复原,然后 map() 为 number ,最后 yield 产出