先來看兩種解法:
//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ì)象展開成一系列用逗號(hào)隔開的值。ES6提供了新的數(shù)據(jù)結(jié)構(gòu)Set。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復(fù)的值,set內(nèi)部可用for...of...遍歷。Set函數(shù)可以接受一個(gè)數(shù)組(或類似數(shù)組的對(duì)象)作為參數(shù),用來初始化。例如: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 以后的了。