先來(lái)看兩種解法:
//es6解法
const arr = [1, 1, 2, 3, 4, 4, 5, 5]
console.info([...new Set(arr)])
//es5解法
const arr = [1, 1, 2, 3, 4, 4, 5, 5]
const res = []
for(let i = 0; i < arr.length; res.indexOf(arr[i++]) === -1 && res.push(arr[i - 1]));
console.info(res)
擴(kuò)展運(yùn)算符
...
是把數(shù)組或類數(shù)組對(duì)象展開(kāi)成一系列用逗號(hào)隔開(kāi)的值。ES6
提供了新的數(shù)據(jù)結(jié)構(gòu)Set
爹殊。它類似于數(shù)組蜕乡,但是成員的值都是唯一的,沒(méi)有重復(fù)的值,set
內(nèi)部可用for...of...
遍歷梗夸。Set
函數(shù)可以接受一個(gè)數(shù)組(或類似數(shù)組的對(duì)象)作為參數(shù)层玲,用來(lái)初始化。例如:var set = new Set([1, 2, 3, 4, 4]); [...set] // [1, 2, 3, 4]
反症。
//第二種寫法實(shí)際上是:
const arr = [1, 1, 2, 3, 4, 4, 5, 5]
const res = []
for(let i = 0; i < arr.length; i++){
res.indexOf(arr[i]) === -1 && res.push(arr[i])
};
console.info(res)
三個(gè)注意點(diǎn):
res.indexOf(arr[i++]) === -1
實(shí)際上是先判斷是否等于 -1 然后i
再自增 1 的辛块。&&
運(yùn)算符從左往右依次判斷,當(dāng)當(dāng)前值為true
則繼續(xù)铅碍,為false
則返回此值(是返回未轉(zhuǎn)換為布爾值時(shí)的原值)润绵。res.push(arr[i - 1])
里的i
實(shí)際上實(shí)際上已經(jīng)是自增 1 以后的了。