數組去重在面試和工作中都是比較容易見到的問題,在這裏我們介紹一些數組去重的方法,和大家一起分享一下,如果有的地方不對,大家可以指出來,共同學習。
方法一:使用雙重for循環
這個方法是非常經典的一個數組去重方式,使用比較方式,用數組的第一位和後一位進行比較,如果相等,則用splice方法刪除掉當前一位;該方法雖然在大型數組去重的性能上面有一定缺陷,但是這個方法容易理解和應用,所以使用的人還是蠻多的。
思路:
- 雙層循環,外層循環元素,內層循環時比較值
- 值相同時,則刪去這個值
let arr = ['123', '123', 1,2,3,2,1, '哈哈','hah', '哈哈', 'bibi']
function unique(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i+1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr.splice(j,1)
j--
}
}
}
return arr
}
console.log(unique(arr), '第一種方法');
// 最終輸出結果爲:[ '123', 1, 2, 3, '哈哈', 'hah', 'bibi' ] '第一種方法'
優點:簡單易懂,兼容性好!
缺點:佔用內存高,速度慢
注意:
- 上述方法如果數組中有對象、NaN、數組時是無法正確去重的。
- 雙重遍歷的缺點是複雜度太高。
- 爲了方便起見,下面用到的數組都是上面的數組
方法二:indexOf和includes
使用indexOf(),可以判斷一個數組中是否包含某個值,如果存在則返回該元素在數組中的位置,如果不存在則返回-1。這裏我們新建一個數組來保存去重後的數組,如果該數組不包含元素就將該元素push到該數組中。
// 方法二
function unique1(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
if (res.indexOf(arr[i]) === -1) {
res.push(arr[i])
}
}
return res
}
console.log(unique1(arr), '第二種方法')
// 使用includes()方法也可以判斷數組是否包含某個特定的元素,如果包含就返回true不包含就返回false。這和indexOf()方法有些類似,所以我們使用includes()進行數組去重和indexOf()的方法原理是一樣的。
function unique2(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
if (!res.includes(arr[i])) {
res.push(arr[i])
}
}
return res
}
console.log(unique2(arr), '第二種方法')
注意:在IE6-8下,數組的indexOf方法不存在
方法三: 使用filter
filter()方法創建一個新的數組,新數組中的元素是通過檢查指定數組中符合條件的所有元素。並且filter()不會改變數組,也不會對空數組進行檢測。filter()方法接收一個回調函數。
語法:
arr.filter(function(item,index,arr), value)
這裏我們用判斷indexOf(item)判斷當前元素的索引是否等於當前index,如果相等就返回該元素。
// 方法三
function unique3(arr) {
return arr.filter((item,index, arr) => {
return arr.indexOf(item) === index
})
}
console.log(unique3(arr), '第三種方法')
方法四:使用set
ES6提供了新的數據結構Set。它類似於數組,但是成員的值都是唯一的,沒有重複的值。
// 方法四
function unique4(arr) {
return [...new Set(arr)]
}
console.log(unique4(arr), '第四種方法')
方法五:使用reduce
// 第五種方法
function unique5(arr) {
return arr.reduce((pre, cur) => {
!pre.includes(cur) && pre.push(cur)
return pre
}, [])
}
console.log(unique5(arr), '第五種方法')
方法六:創建對象形式
function unique6(arr) {
let obj = {}, ary = []
arr.map(function (item, index) {
if (obj[item] !== item) { //核心思想,比較
obj[item] = item;
ary.push(item)
}
})
return arr;
}
console.log(unique6(arr), '第六種方法');
注意:
該方法的核心思想和第一個方法是一樣的,也是進行比較,不過採取的方式不一樣,這個方法是事先創建了一個空數組和空對象,通過取對象的屬性值來和數組的當前項比較,如果不存在則把數組的當前項存儲到空數組裏面去;因爲這個方法是一層循環,所以它的性能是明顯優於第一種方法。
總結:數組去重的方法主要是上面幾種,其他的基本都是在此基礎上擴展的。