js 数组for循环去重的几种方法

数组去重的方法有很多种,但少不了两种结构:循环结构(为了处理每一个数组元素,必然少不了它)和分支结构(为了判断是否重复,也肯定要使用到它)。 如果说代码中没有出现以上两种逻辑,要么是采用了递归的思路,要么就是利用到的数据结构(比如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())```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值