關於js去重的這點小事

關於數組去重的問題,應該是老生常談了,現在網上也有很多版本是關於數組去重的。我在這裏就列舉一下常見和我自己的一個數組去重的方法。

1.利用indexOf去重

let arr = [1, 2, 4, 5, 2, 5, 7, 7];
function unique(arr){
	let res = arr.filter(function (item, index, array) {
      return array.indexOf(item) === index;
    })
    return res;
}

這裏利用了indexOf首次出現會返回該元素下標的特性,如果2元素第一次出現時候的下標等於不等於它的下標,則說明重複了。

2.利用對象形式去重

function unique(arr) {
	let res = []
    let obj = {}
     for (let i = 0; i < arr.length; i++) {
       if (!obj[arr[i]]) {
         res.push(arr[i])
         obj[arr[i]] = 1
       } else {
		obj[arr[i]]++
		}
    }
    return res
}

這種方式也可以達到數組去重的目的,而且也可以算出這個元素出現的次數。

以上這兩種都是比較常見的形式,但這種形式會有個問題,如果我的數組改成數組對象的形式呢?
例如,

let arr = [
	{name:"a"},
	{name:"b"},
	{name:"a"}
]

那我們就手動在函數unique中修改邏輯了,這其實不太符合我想要的預期效果,那麼我在這裏就封裝了一unique函數,這個函數可以接受兩個參數,第一個是數組,第二個是你希望比較的函數。

unique(arr,compare);
// 數組去重
  unique(arr, compare) {
    if (!Array.isArray(arr)) {
      return []
    }
    compare = compare || this.isEqual;
    return arr.filter((item, index) => {
      const len = arr.length;
      while (++index < len) {
        if (compare(item, arr[index])) return false;
      }
      return true
    })
  },
  // 默認相等的函數
  isEqual(a, b) {
    return a === b;
  }

那麼在我們使用的時候就可以這樣使用,假設現在有這樣的數組

let arr = [1, 2, 4, 5, 2, 5, 7, 7];
console.log(unique(arr));

 let arr = [
      { name: "a" },
      { name: "b" },
      { name: "c" },
      { name: "a" }
     ]
 function compare(a,b){
	return a.name === b.name
}
console.log(unique(arr));

代碼我也同步到了github上,地址爲
https://github.com/whenTheMorningDark/workinteresting/blob/master/src/utils/utils.js

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