最近,碰到了數組去重,我來辦它啦!正則表達式
一、建立一個新數組,並循環遍歷原數組,將遍歷的元素依次存放到新數組中;數組
二、循環遍歷時,在新數組中對比是否有重複元素,若是有則終止遍歷,不然,存放至新數組。瀏覽器
【注】爲了兼容更多瀏覽器,我使用的是for循環,而沒有用forEach簡化。函數
let arr = [1,2,3,4,2,2,1,3] let newArr = [] for(let i=0; i<arr.length;i++) { let item = arr[i]; //存放遍歷到的元素 if(newArr.includes(item)) { continue; } newArr.push(item); }
一、依次拿出數組的每一項A,用這一項A和它後面的每一項依次比較;性能
二、若是遇到和當前A相同的元素,則在原數組中把這一項移除掉。優化
let arr = [1,2,2,4,3,3,1] for(var i=0;i<arr.length;i++) { var item = arr[i]; for(var j=i+1;j<arr.length;j++) //當前項item後面全部的內容 { var compare = arr[j]; if(compare == item) { arr.splice(j,1); j--; //數組塌陷的解決方法 } } }
在哪引發了數組塌陷?爲何呢?該怎麼解決呢?spa
在內層循環的時候引發了數組塌陷:索引 j 後面的每一項索引都提早了一位!可是下次要比較的應該仍是 j 這個索引的內容!因此咱們在j++以後又將j- -,這樣 j 索引就不會出錯了。code
一、循環數組中的每一項,把每一項放至對象obj中進行存儲:item 屬性名/值:item變量存的值,obj [item]=item;對象
二、若是遇到obj[val]===val,那麼該項必定存在,則刪除;不然,追加到對象中;blog
三、永遠記得處理數組塌陷問題。
能夠看一下圖解:
let arr = [1,2,2,4,3,3,1]; let obj={}; for(let i=0; i<arr.length;i++) { let item = arr[i]; if(obj[item] !== undefined) //obj中是否存在這一項 { arr.splice(i,1); i--; //注意數組塌陷的問題 continue; } obj[item]=item }
用最後一項換取當前重複項,同時刪除最後一項。【代替splice方法】
同時進行了函數封裝,方便使用。
//unique實現數組去重,返回去重後的數組 function unique(arr) { let obj={}; for(let i=0;i<arr.length;i++) { let item = arr[i]; if(obj[item] !== undefined) { arr[i] = arr[arr.length-1]; arr.length--; //刪除數組最後一項 i--; continue; } obj[item] = item; } return arr; } console.log(unique([1,2,3,2,1,1,2]));
一、將數組轉化爲以@符間隔的字符串;
二、使用正則表達式:若是數字從1開始而且有一個@符,且出現了屢次;
三、將不符合正則表達式的元素追加至新數組中。
let arr = [1,2,3,2,2,3]; arr.sort((a,b) => a - b); //按升序排數組 let str = arr.join('@')+'@'; let reg = /(\d+@)\1*/g; let newArr = []; str.replace(reg,(n,m)=>{ m=Number(m.slice(0,m.length-1)); newArr.push(m); }); console.log(newArr);
let arr = [1,2,3,2,2,3]; arr = [...new Set(arr)]; console.log(arr);
以上就是我整理的一些數組去重的方法,但願對你有幫助呀!^_^