注:只实现了去重,交集,差集,并集=A+(B-A) 补集=B-A
示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>haiyang.me - 集合操作</title>
</head>
<body>
<script>
// 去重
Array.prototype.unique = function(copy) {
var list1 = this
list1.reverse()
var i, j, list2 = []
for (i = list1.length - 1; i > -1; i--) {
var item = copy === 'copy' ? list1[i] : list1.pop()
var exist = false
for (j = list2.length - 1; !exist && j > -1; j--) {
if ('number,string'.indexOf(typeof item) > -1 && 'number,string'.indexOf(typeof list2[j]) > -1) {
if (String(item) === String(list2[j])) {
if (typeof item === 'number') list2[j] = item
exist = true
}
} else if (item === list2[j]) exist = true
}
if (!exist) list2.push(item)
}
if (copy === 'copy') {
this.reverse()
return list2
} else {
for (j = list2.length - 1; j > -1; j--) this.push(list2[j])
this.reverse()
return this
}
}
// 交集 (相同部分)
Array.prototype.joint = function(list2, copy) {
if (Object.prototype.toString.call(list2) !== '[object Array]') return this
var i, j, list1 = this
var res = []
for (i = list1.length - 1; i > -1; i--) {
var item = list1[i]
var exist = false
for (j = list2.length - 1; !exist && j > -1; j--) {
if ('number,string'.indexOf(typeof item) > -1 && 'number,string'.indexOf(typeof list2[j]) > -1) {
if (String(item) === String(list2[j])) exist = true
} else if (item === list2[j]) exist = true
}
if (exist) res.push(item)
}
if (copy === 'copy') {
res.reverse()
return res
} else {
this.length = 0
for (j = res.length - 1; j > -1; j--) this.push(res[j])
return this
}
}
// 差集 (去掉 相同部分 剩下的源集合)
Array.prototype.sub = function(list2, copy) {
if (Object.prototype.toString.call(list2) !== '[object Array]') return this
var i, j, list1 = this
var res = []
for (i = list1.length - 1; i > -1; i--) {
var item = list1[i]
var exist = false
for (j = list2.length - 1; !exist && j > -1; j--) {
if ('number,string'.indexOf(typeof item) > -1 && 'number,string'.indexOf(typeof list2[j]) > -1) {
if (String(item) === String(list2[j])) exist = true
} else if (item === list2[j]) exist = true
}
if (!exist) res.push(item)
}
if (copy === 'copy') {
res.reverse()
return res
} else {
this.length = 0
for (j = res.length - 1; j > -1; j--) this.push(res[j])
return this
}
}
// 存在否
Array.prototype.exist = function(vv, strict) {
var list1 = this
var exist = false
for (var i = list1.length - 1; !exist && i > -1; i--) {
if (strict) {
if (vv === list1[i]) exist = true
} else {
if ('number,string'.indexOf(typeof vv) > -1 && 'number,string'.indexOf(typeof list1[i]) > -1) {
if (String(vv) === String(list1[i])) exist = true
} else if (vv === list1[i]) exist = true
}
}
return exist
}
// 转MAP
Array.prototype.tomap = function(vv) {
var res = {}
var list = this
for (var i = list.length - 1; i > -1; i--) {
res[list[i]] = vv === undefined ? true : vv
}
return res
}
// 并集可以直接用concat加unique
var aa = [1, 2, 3, '1', '4', null, undefined, null, -0, '-0'], bb = ['1', null, undefined]
console.log(aa.joint(bb, 'copy'))
console.log(aa.sub(bb, 'copy'))
</script>
</body>
</html>