js 之 数组扁平化
2019-03-27 本文已影响0人
Veycn
var arr = [1,2,{a: 1, b: 2}, 5, [{}, [99, {g: 111}, [{}, {c: 12}]], 1, 'abc', Symbol('aaa')], null, undefined, true, [true, false, 21, [123], 4]]
=> [1,2,{a: 1, b: 2}, 5, {}, 99 ...]
这就是数组的扁平化。
var arr = [
1, 2, 3, [
{
a: 12,
c: 1
},
true,
false,
Symbol('a')
],
10,
[
10,
{
name: 'vey',
age: 12,
sex: 'male'
},
false,
[
999,
false,
{
p: 'this is a paragraph'
}
]
]
]
function flatten(arr) {
var arr = arr || [],
res = [],
len = arr.length
for (var i = 0; i < len ; i ++){
if(isArray(arr[i])){
res = res.concat(flatten(arr[i]))
}else {
res.push(arr[i])
}
}
return res
}
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]'
}
console.log(flatten(arr));
唯一的缺点是不够优雅。
Array.prototype.flatten = function () {
var res = []
this.forEach(function (item) {
Object.prototype.toString.call(item) === '[object Array]' ? res = res.concat(item.flatten()) : res.push(item)
})
return res
}
console.log(arr.flatten())
这样便会好很多.
reduce 方法实现
function flatten(arr) {
arr = arr || []
return arr.reduce(function (prev, next) {
return Object.prototype.toString.call(next) === '[object Array]' ? prev.concat(flatten(next)) : prev.concat(next)
}, [])
}
ES6
const flatten = arr => arr.reduce((prev, next) => {
return Object.prototype.toString.call(next) === '[object Array]' ?
prev.concat(flatten(next)) : prev.concat(next)},
[])
... 简书一行实在是看不了...