javascript數組去重

數組去重在面試和工作中都是比較容易見到的問題,在這裏我們介紹一些數組去重的方法,和大家一起分享一下,如果有的地方不對,大家可以指出來,共同學習。

方法一:使用雙重for循環

這個方法是非常經典的一個數組去重方式,使用比較方式,用數組的第一位和後一位進行比較,如果相等,則用splice方法刪除掉當前一位;該方法雖然在大型數組去重的性能上面有一定缺陷,但是這個方法容易理解和應用,所以使用的人還是蠻多的。

思路:
  1. 雙層循環,外層循環元素,內層循環時比較值
  2. 值相同時,則刪去這個值
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), '第六種方法');
注意:

該方法的核心思想和第一個方法是一樣的,也是進行比較,不過採取的方式不一樣,這個方法是事先創建了一個空數組和空對象,通過取對象的屬性值來和數組的當前項比較,如果不存在則把數組的當前項存儲到空數組裏面去;因爲這個方法是一層循環,所以它的性能是明顯優於第一種方法。

總結:數組去重的方法主要是上面幾種,其他的基本都是在此基礎上擴展的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章