本篇的数组去重,主要是针对前两篇文章数组方法的一个实践应用,并把每一个数组去重的核心思想分享出来,一块儿学习成长,下面是将会应用到的数组方法以下:es6
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]
复制代码
`这个方法的核心思想和上面的方法是同样的,也是进行比较,不过采起的方式不同而已,这个方法是事先建立了一个空数组和空对象,经过取对象的属性值来和数组的当前项比较,若是不存在则把数组的当前项存储到空数组里面去;由于这个方法是一层循环,因此它的性能是明显优于上面的方法。spa
方法三 `code
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,有则不作任何处理。orm
方法四 `对象
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这个过滤器的特性。
结语
本篇章节的分享内容相对比前两篇内容略少,本章节的主要目的就是对数组方法的实践应用,要了解更多数组特性,能够去看我前两篇文章,谢谢。