1、ES3
支持链式写法
改变原有数组
手动优化内存
扩展到原型方法
还可以在内部新建一个数组,向其中push符合条件的数据,最后返回,不过内存有点浪费
Array.prototype.myUnique = function myUnique() {
let obj = {};
for (let i = 0; i<this.length; i++) {
let item = this[i];
obj.hasOwnProperty(item) ? (this[i] = this[this.length-1],this.length--, i--) : obj[item] = item; //让重复值等于最后一项,优化循环次数,但会改变数组顺序;i--解决数组塌陷
}
obj = null; //手动优化内存
return this; //返回实例,支持链式写法
};
~function (pro) {
function myUnique() {
let obj = {};
for (let i = 0; i < this.length; i++) {
let item = this[i];
if (obj.hasOwnProperty(item)) {
this.splice(i, 1);//删除重复项,不会改变顺序,循环次数会多
i--;
continue;
}
obj[item] = item;
}
obj = null;
return this;
}
pro.myUnique = myUnique
}(Array.prototype);
2、es5
利用es5的filter进行去重
arr.filter(function(value,index,arr){
return index === arr.indexOf(value)
})
3、es6
利用es6的新类型进行去重
Array.prototype.unique=function(){
return Array.from(new Set(this));
}