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

    技术2023-11-10  71

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