在平时做案例等时经常会遇到数组去重的问题,之前一直都是选择不理睬的态度,不过这样‘错误的选择’并没有持续多久,某天还是把它弄懂了,哈哈哈,开心。据听说数组去重在面试中也会问道,所以赶紧拿个小本本记下
数组去重有好多方法,目前我只学到了2种,不过,这两种方法可是非常实用的,当然也非常理解,牢记。
1.利用对象的属性不会重复的原理进行去重
把数组里的每一位放在对象里面,当做它的属性名,挨个访问这对象的属性名看有没有这个属性值
例:var arr =[1,1,1,2,2,2,2,2,3,3,5,6,7];
var temp = {};
遍历一遍数组arr,arr[0] =1,arr[1]=1,arr[2]=1,相继的与temp对象属性值做对比,temp[0]=undefined,就将arr数组的第一个值当作temp的“键”,并随意给他写个“值”,等到第二次遇到arr[1],temp已经有个相应的属性了,就直接忽视了,这样就达到去重的效果。代码如下
var arr =[1,1,1,2,2,2,2,2,3,3,5,6,7];
Array.prototype.unique = function(){
var temp = {},
arr = [],
len = this.length;
for(var i = 0;i<len;i++){
// 拿出当前对象的当前的数组位
if(!temp[this[i]]){
temp[this[i]] = 'abc';//一定要给temp对象赋值(值随便)
arr.push(this[i]);
}
}
return arr;
}
//输出结果
arr.unique();
(6) [1, 2, 3, 5, 6, 7]
2.采用ES6中的set方法
在es6中,set就是一构造函数,类似于数组,它是不允许内部出现相同的元素的。利用这一属性达到去重目的。
const set=new Set([1,1,3,'3',7,9,4,8]);//此时set为set型数组,并非正常数组
console.log([...set]);//神奇三点将set型数组转换为正常数组
console.log(Array.from(set));
//打印结果为:
[1, 3, "3", 7, 9, 4, 8]
[1, 3, "3", 7, 9, 4, 8]
好了,去重就说到这,下面加一个小插曲,一个typeof的封装,嘿嘿嘿嘿嘿
typeof的封装
<script>
function type(target){
var ret = typeof(target);
var template = {
'[object Object]':'object-Object',
'[object Array]':'array-Object',
'[object Number]':'number-Object',
'[object Boolean]':'boolean-Object',
'[object String]':'string-Object'
}
if(target===null) {
return null;
}else if(ret == 'object'){
var str = Object.prototype.toString.call(target);
return template[str];
}else{
return ret;
}
}
</script>