陣列去重
1 雙層for回圈(類似冒泡排序的雙層回圈寫法)
var arr = [2,3,4,2,34,21,1,12,3,4,1]
for(var i =0;i<arr.length;i++){
//第一層:每次回圈拿到arr中一個元素
for(var j=i+1;j<arr.length;j++){
//第二層:每次拿到的元素再和每次拿到的元素后邊的元素依次進行比對(因為第一個要從第二個開始比,第二個要從第三個比以此類推,所以這里的j應比i大1為j=i+1)
if(arr[i] === arr[j]){
//如果相同就洗掉后邊的元素
arr.splice(j,1)
}
}
}
//arr:[1, 2, 3, 4, 12, 21, 34]
2 回圈和indexof、回圈和includes
創建新陣列,回圈舊陣列,看每次回圈的元素是否存在于新陣列中沒有就把當前元素添加到新陣列中
//indexof
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = []
arr.forEach((e)=>{
if(arr2.indexOf(e)==-1){
arr2.push(e)
}
})
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]
//includes
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = []
arr.forEach((e)=>{
if(!arr2.includes(e)){
arr2.push(e)
}
})
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]
3 利用物件屬性不能重復去重
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var obj = {};
arr.forEach((e,i)=>{
obj[arr[i]] = "abc";
});
var arr2=Object.keys(obj)
console.log(arr2)
//arr2:["1", "2", "3", "4", "12", "21", "34"]
var arr3 = arr2.map(e => ~~e )
//arr3:[1, 2, 3, 4, 12, 21, 34]
//注意這種方法不僅給陣列重新排列而且還改變了陣列中元素的型別
~是js里的按位取反運算子,~~就是執行兩次按位取反,其實就是保持原值,但是注意雖然是原值,但是對布爾型變數執行這個操作,會轉化成相應的數值型變數,也就是 ~~true === 1,~~false === 0,
4 ES6 Set
ES6 提供了新的資料結構 Set,它類似于陣列,但是成員的值都是唯一的,沒有重復的值,
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr1 = [...new Set(arr)]
console.log(arr1)
//arr1:[1, 2, 3, 4, 12, 21, 34]
5 ES6 Array. prototype.filter()
注:indexOf在陣列中找元素的時候,碰到符合條件的第一個就會把它的下標回傳
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = arr.filter((e,i)=>{
//看每次回圈的元素在陣列中出現的第一個下標位置(indexOf回傳的位置),和每次回圈的元素的下標(filter回圈每次的i)是否一致,一致就說明他就是第一個符合條件,不會被過濾掉,
return arr.indexOf(e)==i;
})
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]
6 ES6 Array. prototype.reduce()
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = arr.reduce((pre,e)=>{
//這里當然也可以用indexOf來判斷是否存在
pre.includes(e)?pre:pre.push(e);
return pre
},[])
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/303063.html
標籤:其他
上一篇:js的reduce的一些用法總結
下一篇:陣列的方法
