1.項中最多一層深度的扁平化
1.1concat() + apply
Array.prototype.concat.apply([],arr)
例子:
Array.prototype.concat.apply([],[1,2,3,4,5,[6,7]])
// 這樣寫相當于在一個空的陣列上呼叫concat然后給他穿進去的引數不是一個陣列,而是這個陣列里的項,這是利用了apply的特性,因為apply第二個引數接受一個陣列,然后陣列里面的內容就是引數,等同于下面的樣子:
[].concat(1,2,3,4,5,[6,7])
1.2 concat() + 拓展運算子
[].concat(...arr)
這樣寫就相當于把陣列打碎了,比如把[1,2,3,4,5,[6,7]]打碎成1,2,3,4,5,[6,7]
然后呼叫[].concat(1,2,3,4,5,[6,7]) 結果就是 [1, 2, 3, 4, 5, 6, 7]
所以有了拓展運算子apply就可以下崗了,可讀性非常的強,
1.3 flat()
這個是為了扁平化的專門的函式,可以扁平化自定義層的的陣列,語法如下
var newArray = arr.flat([depth]);
depth 是指定的深度,默認為1
例如:
const arr=[[1,2,3],[4,5,6]];
console.log(arr.flat()) // [1,2,3,4,5,6]
如果是多層的話,
const arr=[[1,2,3],[4,[5,6]]];
console.log(arr.flat()) // [1,2,3,4,[5,6]]
console.log(arr.flat(2)) // [1,2,3,4,5,6]
2.項中最多N層陣列的扁平化
2.1 遞回方法
自然想到的就是遞回了,遞回需要一個終點,這個終點就是下面的hasArray(),如果這個陣列里面的項不存在Array物件,都是基本資料的話,就回傳false,否則回傳true,
// 判斷陣列里面還有陣列嗎,(終點判定)
function hasArray(arr){
for(item of arr){
if(Array.isArray(item)){
return true
}
}
return false
}
// 扁平化一個深度為一層陣列
function paiping(arr){
// ES6寫法:
return [].concat(...arr)
// ES5寫法:
// return Array.prototype.concat.apply([],arr)
}
// 扁平化N層深度的陣列
function paiping2(arr){
if(hasArray(arr)){
return paiping2(paiping(arr))
}else{
return arr
}
}
可以簡化一下:簡潔的一批,是吧,不解釋了,對照著上面看就好了,
function fn(arr){
for(item of arr){
if(Array.isArray(item)){
return fn([].concat(...arr))
}
}
return arr
}
2.2 toString()
無論你的陣列多深,只要你toString一下,他們的結構就沒有了,
const arr = [[1, 2, 3], [4, [5, 6]]];
console.log(arr.toString()) // "1,2,3,4,5,6"
這時候我們針對這個字串,用split分隔一下逗號,生成一個單個字串陣列,
let arr1 = arr.toString().split(',') // ["1", "2", "3", "4", "5", "6"
我們現在只需要遍歷一下,把他轉化成數字就行了,
let arrnum = arr1.map((val) => {
// console.log(val)
return parseInt(val)
})
console.log(arrnum) // [1,2,3,4,5,6]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/142392.html
標籤:JavaScript
