本篇的陣列去重,主要是針對前兩篇文章陣列方法的一個實踐應用,並把每個陣列去重的核心思想分享出來,一起學習成長,下面是將會應用到的陣列方法如下:
splice()
indexOf()
includes()
find()
findIndex()
filter()
Array.from()
方法一 `
var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
for (var i = 0; i < arr.length; i++) { // 方法1
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) { //核心思想,比較
arr.splice(i, 1)
i --;
}
}
}
console.log(arr.sort()); // 輸出 [1, 3, 5, 7, 9]
複製程式碼
` 這個去重的方法是非常經典的一個陣列去重方式,採用比較方式,採用陣列的第一位和後一位進行比較,如果相等,則使用splice方法刪除掉當前一位;這個方法雖然在大型陣列去重的效能上面有一定缺陷,但是這個方法容易理解和應用,所以使用的人還是蠻多的。
方法二 `
var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
var obj = {}, ary = []
arr.map(function (item, index) { //方法2
if (obj[item] !== item) { //核心思想,比較
obj[item] = item; //
ary.push(item)
}
})
console.log(ary.sort())// // 輸出 [1, 3, 5, 7, 9]
複製程式碼
`這個方法的核心思想和上面的方法是一樣的,也是進行比較,不過採取的方式不一樣而已,這個方法是事先建立了一個空陣列和空物件,通過取物件的屬性值來和陣列的當前項比較,如果不存在則把陣列的當前項儲存到空陣列裡面去;因為這個方法是一層迴圈,所以它的效能是明顯優於上面的方法。
方法三 `
var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
var ary = []
for (var i = 0, len = arr.length; i < len; i++) {
if (ary.indexOf(arr[i]) == -1) {// 核心思想,索引
ary.push(arr[i])
}
}
console.log(ary.sort()) // 輸出 [1, 3, 5, 7, 9]
複製程式碼
`這個方法的核心思想是通過indexOf這個方法去ary這個新陣列裡查詢arr陣列裡的當前項,如果沒有則存入ary,有則不做任何處理。
方法四 `
var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
var ary = []
for (var item of arr) {
if (!ary.includes(item)) {
ary.push(item)
}
}
console.log(ary.sort()) // 輸出 [1, 3, 5, 7, 9]
複製程式碼
`這個方法和上面的方法思想是一樣的,這裡也是建立一個新陣列,然後在迴圈arr的過程裡,使用includes來檢測ary這個新陣列裡是否有包含這個值,有則什麼都不做,沒有則存入新陣列。
方法五 `
var ary = new Set(arr)
console.log(Array.from(ary).sort()) // 輸出 [1, 3, 5, 7, 9]
複製程式碼
`這個方法程式碼體非常的簡短,它是應用了es6的新的資料型別Set(),它類似於陣列,但是成員的值都是唯一的,沒有重複的值;Set的資料也具備Iterable介面的,所以我直接使用Array.form()把它轉換為陣列就行了。
方法六 `
var ary = []
for (var i = 0, len = arr.length; i < len; i++) { // 方法六
var bol = ary.find(function (item) {
if (item == arr [i]) {
return item
}
})
if (!bol) {
ary.push(arr[i])
}
}
console.log(ary.sort()) // 輸出 [1, 3, 5, 7, 9]
複製程式碼
` 這個方法使用了陣列方法find,find方法本來就是去搜尋陣列裡是否有自符合條件的物件,有則返回該物件,沒有則返回undefined,正是因為這個特性,所以在迴圈前我也新建一個空陣列,去執行find,有則啥也不做,沒有則存入。
方法七 `
var ary = []
for (var i = 0, len = arr.length; i < len; i++) { // 方法八
var idx = ary.findIndex(function (item) {
if (item == arr [i]) {
return item
}
})
if (idx == -1) {
ary.push(arr[i])
}
}
console.log(ary.sort()) // 輸出 [1, 3, 5, 7, 9]
複製程式碼
`這個相信大家一眼就看明白了,這個和上面的方法一樣,只是換成了findIndex,從找符合條件的返回當前物件變成返回索引,就這一點不同,思想都一樣。
方法八 `
var arry = []
var ary = arr.filter(function (item, index) {
if (arry.indexOf(item) == -1) {
arry.push(item);
return item;
}
})
console.log(ary, arry) //輸出[3, 7, 5, 9, 1], [3, 7, 5, 9, 1]
複製程式碼
`這個方法呢主要其實也是indexOf來做搜尋查詢的,只是把for迴圈換成了filter而已,所以它的思想和上面使用indexOf的一樣,之所這麼大費周章的演示一下,其目的也是為了展示一下陣列的方法而已,filter這個過濾器的特性。
結語
本篇章節的分享內容相對比前兩篇內容略少,本章節的主要目的就是對陣列方法的實踐應用,要了解更多陣列特性,可以去看我前兩篇文章,謝謝。