题目:
请写出一个数组拍平函数。效果如下:
var arr=['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4];
flat(arr) //a,b,c,2,d,e,f,g,3,4
方法一:使用toString方法先将arr转换为一个字符串, 再以split分割为数组,再将数组里面的元素转换为数字类型
1
2
3
4
5
6
7
|
var arr =[ 'a' , [ 'b' , 'c' ], 2, [ 'd' , 'e' , 'f' ], 'g' , 3, 4];
function flat(arr) {
return arr.toString().split( ',' ).map( function (item){
return Number(item)
})
}
console.log(flat(arr))
|
方法二: toString 格式转换 与方法一类似 都是隐士类型转换
1
2
3
4
5
6
7
8
9
10
11
12
13
|
var arr = [ 'a' , [ 'b' , 'c' ], 2, [ 'd' , 'e' , 'f' ], 'g' , 3, 4];
// 方法二:toString(格式转换)
var flag = function (arr) {
let toString = Array.prototype.toString;
Array.prototype.toString = function () {
return this .join( ',' );
};
let result = arr + '' ;
Array.prototype.toString = toString;
return result;
};
console.log(flag(arr));
|
方法三: valueOf(格式转换) 与方法一 二类似 都是隐士类型转化原理
1
2
3
4
5
6
7
8
9
|
// 方法三:valueOf(格式转换)
Array.prototype.valueOf = function () {
return this .join( ',' );
};
var flat = function (arr) {
return arr + '' ;
};
console.log(flat([ 'a' , [ 'b' , 'c' ], 2, [ 'd' , 'e' , 'f' ], 'g' , 3, 4]));
|
方法四: 利用reduce特性
1
2
3
4
5
6
7
|
function flat(arr) {
return newArr = arr.reduce((a, b) => {
return a.concat(b)
}, [])
}
var arr = [ 'a' , [ 'b' , 'c' ], '2' , [ 'd' , 'e' , 'f' ], 'g' , 3, 4];
console.log(flat(arr));
|
方法五:利用递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function flat(array) {
var result = [];
var each = function (arr) {
arr.forEach(item => {
if (item instanceof Array) {
each(item);
} else {
result.push(item);
}
});
};
each(array);
return result.join( ',' );
}
var arr = [ 'a' , [ 'b' , 'c' , [7, 8]], 2, [ 'd' , 'e' , 'f' ], 'g' , 3, 4];
console.log(flat(arr));
|
方法六: ES6的遍历器 Iterator 给数据结构增加遍历器必须增加一个next方法
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
34
35
36
37
38
39
|
// Iterator
Array.prototype[Symbol.iterator] = function () {
let arr = [].concat( this );
// arr=['a', ['b', 'c'], '2', ['d', 'e', 'f'], 'g', 3, 4]
let getFirst = function (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) {
return {
value: item,
done: false ,
};
} else {
return {
done: true ,
};
}
},
};
};
var flat = function (arr) {
let r = [];
for (let i of arr) {
r.push(i);
} // i 已经是单个元素
return r.join( ',' );
};
var arr = [ 'a' , [ 'b' , 'c' ], '2' , [ 'd' , 'e' , 'f' ], 'g' , 3, 4];
console.log(flat(arr));
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/Qooo/p/13847897.html