數組去重(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
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
神操作
- 如果使用underscore 或者 lodash的話應該可以使用_.uniq
- 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