unique:数组去重,返回一个新数组
function unique(arr){
if(!isArrayLink(arr)){ //不是类数组对象
return arr
}
let result = []
let objarr = []
let obj = Object.create(null)
arr.forEach(item => {
if(isStatic(item)){//是除了symbol外的原始数据
let key = item + '_' + getRawType(item);
if(!obj[key]){
obj[key] = true
result.push(item)
}
}else{//引用类型及symbol
if(!objarr.includes(item)){
objarr.push(item)
result.push(item)
}
}
})
return resulte}
Set简单实现
window.Set = window.Set || (function () {
function Set(arr) {
this.items = arr ? unique(arr) : [];
this.size = this.items.length; // Array的大小
}
Set.prototype = {
add: function (value) {
// 添加元素,若元素已存在,则跳过,返回 Set 结构本身。
if (!this.has(value)) {
this.items.push(value);
this.size++;
}
return this;
},
clear: function () {
//清除所有成员,没有返回值。
this.items = []
this.size = 0
},
delete: function (value) {
//删除某个值,返回一个布尔值,表示删除是否成功。
return this.items.some((v, i) => {
if(v === value){
this.items.splice(i,1)
return true
}
return false
})
},
has: function (value) {
//返回一个布尔值,表示该值是否为Set的成员。
return this.items.some(v => v === value)
},
values: function () {
return this.items
},
}
return Set;}());