Javascript -- 數組去重方法

1、數組去重

一、雙循環去重

var data = [1,2,4,3,5,2,1,3,2]
var newData = []
for(var i=0;i<data.length;i++) {
  for(var j=i+1;j<data.length;j++) {
    if (data[i] == data[j]) {
      // j = i = i + 1
      j = ++i
    }
  }
  newData.push(data[i])
}
console.log(newData.sort())

外面循環是每次取數組一個值,裏面的循環是遍歷除了取了的值之外的後面的全部值做比較,若是有相等的話,就跳過進行下輪循環比較,若是當前值沒有找到任何相等的值,就添加到新數組es6

這個就是取數組裏面的值取一一比較,若是這個值在數組後面的項裏有了,那我就不要這個值,依次類推,其實就是取數組裏這個值的最後一項,由於已是最後一項了,不可能有相等的數組

二、雙循環+splice去重

const arr = [1, 2, 3, 5, 4, 3, 2, 1];
for (var i=0;i<arr.length; i++) {
  for (var j=i+1;j<arr.length; j++) {
    if (arr[i] === arr[j]) {
      arr.splice(j,1)
      j--
    }
  }
}
console.log(arr)

// 打印結果
[1, 2, 3, 5, 4]

經過雙循環判斷數組裏是否有相同的值,若是有相同的值,就將後面相同的值去掉,splice方法會改變原數組,splice()方法返回的是分割的值的數組,原數組就是除去被分割出去的值後剩餘值的數組閉包

爲社麼j--?由於分割後,原數組長度減一了,上一個值降下來了,若是j不減1,在數組裏面的j就是上一個值了,在加一下,就至關於跳過了,因此須要減1而後再執行循環裏的加1獲取上一個值code

三、循環+閉包+indexOf

var data = [1,2,4,3,5,2,1,3,2]
var newData = []
for(var i=0;i<data.length;i++) {
  ;(function () {
    if (newData.indexOf(data[i]) === -1) {
      newData.push(data[i])
    }
  })(i);
}
console.log(newData.sort())

經過循環遍歷,傳入循環數組的索引,而後經過indexOf判斷新數組裏面是否有這個數組索引的值,若是沒有,則將數組索引的值添加到新數組裏面對象

四、循環+對象

var data = [1,2,4,3,5,2,1,3,2]
var newData = []
var obj = {}
for(var i=0;i<data.length;i++) {
  if (!obj[data[i]]) {
    obj[data[i]] = 1
    newData.push(data[i])
  }
}
console.log(newData.sort())

這個方法利用的就是同一個對象的key值不能重複,因此經過判斷對象裏是否有當前數組索引的值,若是沒有,則將這個數組值做爲key添加到對象裏面,經過也把這個值添加到新數組裏面,若是對象有這個key值和數組索引的值相同,則跳過索引

五、ES6語法-Set

var data = [1,2,4,3,5,2,1,3,2]
var newData = []
newData = new Set(data)
console.log(newData)

這個就不去深究了io

相關文章
相關標籤/搜索