js数组去重之核心思想

本篇的数组去重,主要是针对前两篇文章数组方法的一个实践应用,并把每个数组去重的核心思想分享出来,一起学习成长,下面是将会应用到的数组方法如下:

  • splice()
  • indexOf()
  • includes()
  • find()
  • findIndex()
  • filter()
  • Array.from()

方法一 `

var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
for (var i = 0; i < arr.length; i++) {	// 方法1
	for (var j = i + 1; j < arr.length; j++) {
		if (arr[i] == arr[j]) { //核心思想,比较
			arr.splice(i, 1)
				i --;
			}
		}
	}
console.log(arr.sort());    // 输出 [1, 3, 5, 7, 9]
复制代码

` 这个去重的方法是非常经典的一个数组去重方式,采用比较方式,采用数组的第一位和后一位进行比较,如果相等,则使用splice方法删除掉当前一位;这个方法虽然在大型数组去重的性能上面有一定缺陷,但是这个方法容易理解和应用,所以使用的人还是蛮多的。

方法二 `

var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
var obj = {}, ary = []  
	arr.map(function (item, index) {    //方法2
		if (obj[item] !== item) {   //核心思想,比较
			obj[item] = item;   //
			ary.push(item)
		}
	})
	console.log(ary.sort())// // 输出 [1, 3, 5, 7, 9]
复制代码

`这个方法的核心思想和上面的方法是一样的,也是进行比较,不过采取的方式不一样而已,这个方法是事先创建了一个空数组和空对象,通过取对象的属性值来和数组的当前项比较,如果不存在则把数组的当前项存储到空数组里面去;因为这个方法是一层循环,所以它的性能是明显优于上面的方法。

方法三 `

var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
var ary = []
for (var i = 0, len = arr.length; i < len; i++) {	
	if (ary.indexOf(arr[i]) == -1) {// 核心思想,索引
		ary.push(arr[i])
		}
	}
	console.log(ary.sort()) // 输出 [1, 3, 5, 7, 9]
复制代码

`这个方法的核心思想是通过indexOf这个方法去ary这个新数组里查询arr数组里的当前项,如果没有则存入ary,有则不做任何处理。

方法四 `

var arr = [3, 7, 3, 5, 7, 9, 1, 5, 9, 9]
var ary = []
	for (var item of arr) {	
		if (!ary.includes(item)) {
			ary.push(item)
		}
	}
console.log(ary.sort()) // 输出 [1, 3, 5, 7, 9]
复制代码

`这个方法和上面的方法思想是一样的,这里也是创建一个新数组,然后在循环arr的过程里,使用includes来检测ary这个新数组里是否有包含这个值,有则什么都不做,没有则存入新数组。

方法五 `

var ary = new Set(arr)	
console.log(Array.from(ary).sort())  // 输出 [1, 3, 5, 7, 9]
复制代码

`这个方法代码体非常的简短,它是应用了es6的新的数据类型Set(),它类似于数组,但是成员的值都是唯一的,没有重复的值;Set的数据也具备Iterable接口的,所以我直接使用Array.form()把它转换为数组就行了。

方法六 `

var ary = []
for (var i = 0, len = arr.length; i < len; i++) {	// 方法六
	var bol = ary.find(function (item) {
		if (item == arr [i]) {
			return item
		}
	})
	if (!bol) { 
		ary.push(arr[i])
		}
	}
console.log(ary.sort())  // 输出 [1, 3, 5, 7, 9]
复制代码

` 这个方法使用了数组方法find,find方法本来就是去搜索数组里是否有自符合条件的对象,有则返回该对象,没有则返回undefined,正是因为这个特性,所以在循环前我也新建一个空数组,去执行find,有则啥也不做,没有则存入。

方法七 `

var ary = []
for (var i = 0, len = arr.length; i < len; i++) {	// 方法八
	var idx = ary.findIndex(function (item) {
		if (item == arr [i]) {
			return item
		}
	})
	if (idx == -1) {
		ary.push(arr[i])
	}
}
console.log(ary.sort())  // 输出 [1, 3, 5, 7, 9]
复制代码

`这个相信大家一眼就看明白了,这个和上面的方法一样,只是换成了findIndex,从找符合条件的返回当前对象变成返回索引,就这一点不同,思想都一样。

方法八 `

var arry = []
	var ary = arr.filter(function (item, index) {				
		if (arry.indexOf(item) == -1) {
			arry.push(item);
			return item;
		}
	})
	console.log(ary, arry)  //输出[3, 7, 5, 9, 1], [3, 7, 5, 9, 1]
复制代码

`这个方法呢主要其实也是indexOf来做搜索查询的,只是把for循环换成了filter而已,所以它的思想和上面使用indexOf的一样,之所这么大费周章的演示一下,其目的也是为了展示一下数组的方法而已,filter这个过滤器的特性。

结语

本篇章节的分享内容相对比前两篇内容略少,本章节的主要目的就是对数组方法的实践应用,要了解更多数组特性,可以去看我前两篇文章,谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值