本篇的数组去重,主要是针对前两篇文章数组方法的一个实践应用,并把每个数组去重的核心思想分享出来,一起学习成长,下面是将会应用到的数组方法如下:
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这个过滤器的特性。
结语
本篇章节的分享内容相对比前两篇内容略少,本章节的主要目的就是对数组方法的实践应用,要了解更多数组特性,可以去看我前两篇文章,谢谢。