数组去重的方法有很多种,但少不了两种结构:循环结构(为了处理每一个数组元素,必然少不了它)和分支结构(为了判断是否重复,也肯定要使用到它)。 如果说代码中没有出现以上两种逻辑,要么是采用了递归的思路,要么就是利用到的数据结构(比如Set数据结构)或方法已经帮我们处理了那些逻辑。
var arr = ['a', 'b', 'c', 'c', 'd', 'e', 'e', 1, 1, 1]
// 这个两个方法会改变原有的排序 不推荐使用 理解即可
Array.prototype.unique1 = function () {
// this 是指当前的数组
var self = this
// 排序
self.sort()
let newArr = [this[0]]
for (var i = 1; i < self.length; i++) {
// 逻辑就是 因为排序了 所以相同元素都会排在一起
// 所以老数组的相同的第二个元素会等于最后新数组的最后一个元素
if (self[i] !== newArr[newArr.length - 1]) {
newArr.push(this[i])
}
}
return newArr
}
Array.prototype.unique2 = function () {
this.sort()
var newArr = []
for (var i = 0; i < this.length; i++) {
// 老数组前后两个元素 相等就跳过该元素
if (this[i + 1] !== this[i]) {
newArr.push(this[i])
}
}
return newArr
}
// 不改变原有的排序
// 最简单的方法
Array.prototype.unique3 = function () {
// Set是ES6提供的一个数据结构,里面的元素不能出现重复
// Array.from()ES6新增的数组方法,该方法可以将一个类数组对象或可遍历对象转换成真正的数组
// return Array.from(new Set(this))
// 或者用扩展运算符
return [...new Set(this)]
}
Array.prototype.unique4 = function () {
// 存放数组去重的值
var res = []
// 利用对象的唯一性 没有就赋值 例如 stringa = 1
var isIn = {}
for (var i = 0; i < this.length; i++) {
// 判读对象里面是否存在
if (!isIn[typeof this[i] + this[i]]) {
res.push(this[i])
isIn[typeof this[i] + this[i]] = 1
}
}
return res
}
Array.prototype.unique5 = function () {
var newArr = []
for (var i = 0; i < this.length; i++) {
// 每一项跟新数组匹配下标 没有加增加到新数组中
if (newArr.indexOf(this[i]) === -1) {
newArr.push(this[i])
}
}
return newArr
}
Array.prototype.unique6 = function () {
var newArr = []
for (var i = 0; i < this.length; i++) {
// 每一项跟老数组匹配 如果下标相等相当于第一次出现
// indexOf返回第一个匹配的下标 不相等相当于重复了
if (this.indexOf(this[i]) === i) {
newArr.push(this[i])
}
}
return newArr
}
Array.prototype.unique7 = function () {
var newArr = []
for (var i = 0; i < this.length; i++) {
// 每一项跟老数组匹配 如果下标相等相当于第一次出现
// indexOf返回第一个匹配的下标 不相等相当于重复了
if (this.lastIndexOf(this[i]) === i) {
newArr.push(this[i])
}
}
return newArr
}
// 双重for循环
Array.prototype.unique8 = function () {
var newArr = []
for (var i = 0; i < this.length; i++) {
// 假设元素没有重复
let flag = true
for (var j = 0; j < newArr.length; j++) {
// 如果有就标记
if (this[i] == newArr[j]) {
flag = false
break
}
}
// 没有就添加到新数组里面
if (flag) {
newArr.push(this[i])
}
}
return newArr
}
// console.log(arr.unique8())```