編寫一個程序,將數組扁平化,並去除其中重複部分,最終獲得一個升序且不重複的數組:正則表達式
就它啦: let arr = [3, 12, 1, 2, [3, 4, 4, [5, 4,6, [8,9,7, 8, [9, 10, 11]]]]];數組
第一種方法,直接調用arr的flat方法ide
arr = arr.flat(Infinity);
有個小點兒要說明。arr.flat()默認只展開一級,默認括號內爲 1
那麼上面的arr展開爲
flat(2)爲函數
爲了一步到位,直接flat(Infinity);
還有一件事,若是數組內有空的選項,則會被刪除
let arr1 = [1, 1, , 2] arr1 = arr1.flat(Infinity); console.log(arr1) 打印出只有[1, 1, 2]
而後如何數組去重呢:this
new Set(arr)spa
返回的是一個對象 , 僞數組prototype
如何將變成數組呢?3d
兩種方法:code
1.展開運算符 [...new Set(arr)] 使其變成數組
2.Array.from() 可將一個 僞數組對象或者可遍歷對象轉換成一個真正的數組
即
Array.from(new Set(arr))
Array.from有三個參數,Array.from(arrayLike[, mapFn[, thisArg]]),arrayLike:想要轉換成數組的僞數組對象或可迭代對象;mapFn:若是指定了該參數,新數組中的每一個元素會執行該回調函數;thisArg:可選參數,執行回調函數 mapFn 時 this 對象。該方法的返回值是一個新的數組實例(真正的數組)。對象
arr = Array.from(new Set(arr)).sort((a, b) => a - b) 就可以實現扁平化,去重並排序
第二種方法:
arr.toString(arr) arr,就是要扁平化的那個數組,名字任意起
數組toString以後,無論你有多少級,最後都會直接以逗號分隔的字符串,沒有中括號和所謂的層級了,至關於直接的扁平化了
arr = arr.toString().split(',').map( item => {
return Number(item)
})
arr.toString(arr)
arr.toString(arr).split(',')
這裏必定要寫成split(',') 逗號不能省。
而後使用map進行遍歷,讓每一項都變成 數字類型
------------------------------------
有個小細節:
不寫則會 split('')的逗號則會:
由於:
參數 | 描述 |
---|---|
separator | 必需。字符串或正則表達式,從該參數指定的地方分割 stringObject。 |
howmany | 可選。該參數可指定返回的數組的最大長度。若是設置了該參數,返回的子串不會多於這個參數指定的數組。若是沒有設置該參數,整個字符串都會被分割,不考慮它的長度。 |
返回值
一個字符串數組。該數組是經過在 separator 指定的邊界處將字符串 stringObject 分割成子串建立的。返回的數組中的字串不包括 separator 自身。
arr = JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map( item => { return Number(item) })
第四種方法:
while(arr.some( item => Array.isArray(item))){ arr = [].concat(...arr); }
這裏使用了 some 若是知足條件就返回 布爾值true
Array.isArray(item)是判斷item 是不是數組的,最有效的方式
若是爲真,說明當前item項爲數組
...arr 展開運算符 將當前item數組展開,並使用concat,將 展開的各項,添加到前面的數組內 【】
第五種方法:老老實實遞歸
let result = []; function fn(array){ for(let i = 0; i < array.length; i++){ let item = array[i]; if(Array.isArray(array[i])){ fn(item); }else{ result.push(item) } } return result; }
fn(arr)
就一句話:記得return !!!
第六種方法:reduce
const flatten = (arr) => {
return arr.reduce((prev, next) => {
return prev.concat(Object.prototype.toString.call(next) === '[object Array]' ? flatten(next): next)
}, [])
}
console.log(flatten(arr))
日常使用就直接簡單粗暴,arr.flat(Infinity) ,內部也是執行了遞歸。