众所周知,new Set()方式不可以去重空对象空数组以及包装类函数(可以理解为构造函数),那么在new Set()的方法上进行封装 可不可以呢 太麻烦,而for循环两次比较去重也麻烦 在这里 小曹推荐大家使用对象key不能重复的原理 实现数组去重 上代码:
// 封装数组去重 把数组的值放到对象里面的key 利用key不能重复的原理去重最不会出错
var array = [1, 2, 1, 2, {}, {}, undefined, undefined, null, null, new Array(), new Number(), new Number(), new Array(), [], []]
Array.prototype.unique = function () {
var obj = {}
var arr = []
var len = this.length;
for (var i = 0; i < len; i++) {
if (!obj[this[i]]) {
obj[this[i]] = ‘abc‘
arr.push(this[i])
}
}
return arr
}
本来一开始想用type判断一下传进来的是不是数组作相应的提示 后来发现不需要 直接在Array的原型链上面编程就好了 哈哈原型链真好用 这样就只有数组才有该方法
关键在于取数组值之后,判断这个空对象里面如果没有值 给这个对象的key为数组元素赋值对应的value---“abc”(最好string类型 不然判断取反可能会像0有隐式转换为false)
这样 一路for循环遍历下去 obj的key是不会被重复命名的,所以遇到相同的也就跳过啦 这样就实现了去重,应付一切数组。 原理简单点就是obj.name = ‘abc‘后,obj.name再出现一次,就不会进入if循环 就不会push到新的数组里面被去重函数返回.