js陣列去重之核心思想

IT男爵發表於2018-09-20

本篇的陣列去重,主要是針對前兩篇文章陣列方法的一個實踐應用,並把每個陣列去重的核心思想分享出來,一起學習成長,下面是將會應用到的陣列方法如下:

  • 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這個過濾器的特性。

結語

本篇章節的分享內容相對比前兩篇內容略少,本章節的主要目的就是對陣列方法的實踐應用,要了解更多陣列特性,可以去看我前兩篇文章,謝謝。

相關文章