Fork me on GitHub

JS数组去重

ES6版本

ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
这样我们可以理解为,将数组转化为集合,再由集合转化为数组。

1
[...new Set(arr)]

最简洁

1
2
3
4
5
//利用Array.filter
var arr = ["1", "2", "3", "1", "3"];
arr = arr.filter( function( item, index, inputArray ) {
return inputArray.indexOf(item) == index;
});//Output: ["1", "2", "3"]

这个写法相对简洁,但效率并不怎么高,不适合太长的数组。

改进版

1
2
3
4
5
6
function uniq(a) {
var seen = {};
return arr.filter(function(item) {
return seen.hasOwnProperty(item) ? false : (seen[item] = true);
});
}

这个写法比上一个更有效率,但是有两个缺陷,对于Number和String来说,该算法不能区分,比如:

1
uniq([1,"1",2,"2"])//返回[1, 2]

同理,对于对象来说也不能区分,所有对象都被认为相等。所以使用时要明确使用场景。

1
uniq([{foo:1},{foo:2}])//返回[{foo:1}]

最终版

1
2
3
4
5
6
7
8
9
10
function uniq(a) {
var prims = {"boolean":{}, "number":{}, "string":{}}, objs = [];
return a.filter(function(item) {
var type = typeof item;
if(type in prims)
return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true);
else
return objs.indexOf(item) >= 0 ? false : objs.push(item);
});
}

配合babel,嗯,无敌。

据说帅的人都赏给博主几块钱零花钱。