JS陣列去重的幾種常見方法

一、簡單的去重方法

  1. // 最簡單陣列去重法
  2. /*
  3. * 新建一新陣列,遍歷傳入陣列,值不在新陣列就push進該新陣列中
  4. * IE8以下不支援陣列的indexOf方法
  5. * */
  6. function uniq(array){
  7. var temp = []; //一個新的臨時陣列
  8. for(var i = 0; i < array.length; i++){
  9. if(temp.indexOf(array[i]) == -1){
  10. temp.push(array[i]);
  11. }
  12. }
  13. return temp;
  14. }
  15.  
  16. var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
  17. console.log(uniq(aa));

二、物件鍵值法去重

  1. /*
  2. * 速度最快, 佔空間最多(空間換時間)
  3. *
  4. * 該方法執行的速度比其他任何方法都快, 就是佔用的記憶體大一些。
  5. * 現思路:新建一js物件以及新陣列,遍歷傳入陣列時,判斷值是否為js物件的鍵,
  6. * 不是的話給物件新增該鍵並放入新陣列。
  7. * 注意點:判斷是否為js物件鍵時,會自動對傳入的鍵執行“toString()”,
  8. * 不同的鍵可能會被誤認為一樣,例如n[val]-- n[1]、n["1"];
  9. * 解決上述問題還是得呼叫“indexOf”。*/
  10. function uniq(array){
  11. var temp = {}, r = [], len = array.length, val, type;
  12. for (var i = 0; i < len; i++) {
  13. val = array[i];
  14. type = typeof val;
  15. if (!temp[val]) {
  16. temp[val] = [type];
  17. r.push(val);
  18. } else if (temp[val].indexOf(type) < 0) {
  19. temp[val].push(type);
  20. r.push(val);
  21. }
  22. }
  23. return r;
  24. }
  25.  
  26. var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
  27. console.log(uniq(aa));

三、排序後相鄰去除法

  1. /*
  2. * 給傳入陣列排序,排序後相同值相鄰,
  3. * 然後遍歷時,新陣列只加入不與前一值重複的值。
  4. * 會打亂原來陣列的順序
  5. * */
  6. function uniq(array){
  7. array.sort();
  8. var temp=[array[0]];
  9. for(var i = 1; i < array.length; i++){
  10. if( array[i] !== temp[temp.length-1]){
  11. temp.push(array[i]);
  12. }
  13. }
  14. return temp;
  15. }
  16.  
  17. var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
  18. console.log(uniq(aa));

四、陣列下標法

  1. /*
  2. *
  3. * 還是得呼叫“indexOf”效能跟方法1差不多,
  4. * 實現思路:如果當前陣列的第i項在當前陣列中第一次出現的位置不是i,
  5. * 那麼表示第i項是重複的,忽略掉。否則存入結果陣列。
  6. * */
  7. function uniq(array){
  8. var temp = [];
  9. for(var i = 0; i < array.length; i++) {
  10. //如果當前陣列的第i項在當前陣列中第一次出現的位置是i,才存入陣列;否則代表是重複的
  11. if(array.indexOf(array[i]) == i){
  12. temp.push(array[i])
  13. }
  14. }
  15. return temp;
  16. }
  17.  
  18. var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
  19. console.log(uniq(aa));

五、優化遍歷陣列法

  1. // 思路:獲取沒重複的最右一值放入新陣列
  2. /*
  3. * 推薦的方法
  4. *
  5. * 方法的實現程式碼相當酷炫,
  6. * 實現思路:獲取沒重複的最右一值放入新陣列。
  7. * (檢測到有重複值時終止當前迴圈同時進入頂層迴圈的下一輪判斷)*/
  8. function uniq(array){
  9. var temp = [];
  10. var index = [];
  11. var l = array.length;
  12. for(var i = 0; i < l; i++) {
  13. for(var j = i + 1; j < l; j++){
  14. if (array[i] === array[j]){
  15. i++;
  16. j = i;
  17. }
  18. }
  19. temp.push(array[i]);
  20. index.push(i);
  21. }
  22. console.log(index);
  23. return temp;
  24. }
  25.  
  26. var aa = [1,2,2,3,5,3,6,5];
  27. console.log(uniq(aa));