天天看點

數組去重(JavaScript)先從網上整理一波,待驗證數組去重(JavaScript)

數組去重(JavaScript)

前端面試題:給定一個數組[1,3,2,4,5,3,22,21,2],去重。

方法很多

  • for循環周遊
    • 雙層for循環,存儲到新的數組
    • 雙層for循環,不聲明新的數組,在原數組使用splice方法
  • 利用對象的屬性唯一(有問題)
  • 先排序,然後将第n+1個與第n個比較去重
  • ES6文法,set()
  • 使用遞歸
  • 神操作
  • 一些輪子
  • 其他,比如包含了字元串,或者數組很大

for循環周遊

Array.prototype.distinct = function(){
 var arr = this,
  result = [],
  i,
  j,
  len = arr.length;
 for(i = ; i < len; i++){
  for(j = i + ; j < len; j++){
   if(arr[i] === arr[j]){
    j = ++i;
   }
  }
  result.push(arr[i]);
 }
 return result;
}
var arra = [,,,,,,,,,,];
arra.distinct();    //傳回[3,4,2,1]
           
Array.prototype.distinct = function (){
 var arr = this,
  i,
  j,
  len = arr.length;
 for(i = ; i < len; i++){
  for(j = i + ; j < len; j++){
   if(arr[i] == arr[j]){
    arr.splice(j,);
    len--;
    j--;
   }
  }
 }
 return arr;
};
var a = [,,,,,,,,,,,,,,,,,,,,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56
           

位址

利用對象的屬性唯一(有問題)

function unique(arr){

  var res =[];

  var json = {};

  for(var i=;i<arr.length;i++){

    if(!json[arr[i]]){

      res.push(arr[i]);

      json[arr[i]] = ;

    }

  }

  return res;

}
           

位址

先排序,然後将第n+1個與第n個比較去重

function unique(arr){

  var arr2 = arr.sort();

  var res = [arr2[]];

  for(var i=;i<arr2.length;i++){

    if(arr2[i] !== res[res.length-]){

      res.push(arr2[i]);

    }

  }

  return res;

}
           

位址

ES6文法,set()

貼一個來自尤雨溪的,網址

// ES6
function unique (arr) {
  const seen = new Map()
  return arr.filter((a) => !seen.has(a) && seen.set(a, ))
}
// or
function unique (arr) {
  return Array.from(new Set(arr))
}

作者:尤雨溪
連結:https://www.zhihu.com/question/29558082/answer/44854426
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
           

另一個簡潔的

// ES6:一行關鍵代碼
const uniqueItems = arr => [...new Set(arr)];

// 測試
let arr = [, , , , , , , , , , , , , , , , ];
const uniqueItems = arr => [...new Set(arr)];
uniqueItems(arr);

作者:莊引
連結:https://www.zhihu.com/question/29558082/answer/240560893
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
           
function uniteUnique() {
  const list=[].concat(...arguments);
  return list.reduce((oldlist,nowitem)=>oldlist.includes(nowitem)?oldlist:[...oldlist,nowitem],[]);
}

作者:知乎使用者
連結:https://www.zhihu.com/question/29558082/answer/237161293
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
           

神操作

  1. 如果使用underscore 或者 lodash的話應該可以使用_.uniq
  2. ES6的實作,網址
// 去除相鄰相同的元素
let nub1By = fn => ([x,y,...xs]) => y === undefined ? (x===undefined?[]:[x])
  : fn(x,y) ? nub1By(fn)([y,...xs])
  : [x,...nub1By(fn)([y,...xs])]

nub1By((a,b)=>a==b)([,,,,,,])

// 數組去重——去除前面
let uniqBy = fn => ([x,...xs]) => x === undefined ? []
  : xs.filter(a=>fn(a,x)).length !==  ? uniqBy(fn)(xs)
  : [x,...uniqBy(fn)(xs)]

uniqBy((a,b)=>a==b)([,,,,,,])

// 數組去重——去除後面
let uniq1By = fn => arr => uniqBy(fn)(arr.reverse()).reverse()

uniq1By((a,b)=>a==b)([,,,,,,])
           

一些輪子

jQuery: $.unique

underscore: _.unique

繼續閱讀