数组的去重在日常的开发中经常碰到的需求,虽然我们真实开发过程中会有lodash,Jquery等框架帮助我们。但是,很多时候我们也需要自己来实现这个简单的功能
框架
var arr = [1, 2, 3, 4, 5, 5, 5, 5];
// Jquery
$.unique(arr);
// lodash
_.uniq(arr);
// underscore
_.uniq(arr);
方法-
var arr = [1, 2, 3, 4, 5, 5, 5, 5];
var res = [];
arr.forEach((d) => {
if(res.indexOf(d) === -1) {
res.push(d)
}
});
方法二
var arr = [1, 2, 3, 4, 5, 5, 5, 5];
var res = arr.filter((d, i) => {
return arr.indexOf(d) === i;
})
方法三
如果你的数组里面都是字符串类型,那么可以使用对象KEY的唯一性来实现数组的去重
var arr = ['a', 'b', 'c' , 'a', 'c', 'd'];
var resObject = {};
arr.forEach((d) => {
resObject[d] = (resObject[d] || 1) + 1;
});
var res = Object.keys(resObject);
因为Object的键值必须要是字符串,所以当数组里面有数字,undefined
,bool
等类型时,就没有作用了,但是这个方法不但可以对字符串数组去重,同时也可以统计每个字符串出现的次数
方法四
当我们在往数组里面push
的时候,如果数组本身就可以保持不重复就好了,在ES5中我们没有办法做到,但是在ES6中,我们有了一个新的数据结构Set
set
并不是一个新的数据类型,是属于js基本类型的Object类型下面的
关于set
的说明MDN有如下说明
The Set object lets you store unique values of any type, whether primitive values or object references.
这正是我们需要的,而且set
还可以根传入数组来初始化,而set
也可以很方便的转回数组
let arr = ['a', 'b', 'c' , 'a', 'c', 'd'];
let res = Array.from(new Set(arr));