Hello,大家好,今天给大家的分享数组去重的方法,数组去重在项目里是经常用到的操作,也是面试经常问到的问题,作为一个开发工程师,掌握几种数组去重的方法是必不可少的,通过日常操作和网上收集我总结出一下几种数组去重的方法
Set 直接去重(ES6 常用)
(Set)[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set] 对象允许存储任何类型的唯一值
(Array.form())[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from]对于类数组或是可迭代的对象进行浅拷贝,创建一个新的数组实例对象
function unique(arr) {
return Array.from(new Set(arr))
}
const arr = [1,3,4,1,{},{}, null,null]
console.log([...new Set(arr)]) // 简写方式
console.log(unique(arr)) //[1, 3, 4, {}, {}, null]
优点: 代码量少
缺点: 兼容性不好,无法去除空对象
双层for循环对比值是否相同(ES5 常用)
第一个for循环负责循环遍历元素,第二个for循环负责遍历值,每次的值遍历对比如果相同就删除第二个值
splice(start [, deleteCount] [,item1, item2 …]) 起始值,删除个数, 插入值
function unique(arr){
for(var i=0; i<arr.length; i++){
for(var j=i+1; j<arr.length; j++){
if(arr[i] == arr[j]){
arr.splice(j, 1);
j--;
}
}
}
return arr
}
indexOf 查找新数组里是否有相同的值
indexOf(searchElement[, fromIndex]) 查找数组中给定元素的第一个索引,没找到返回-1
定义一个新的空数组,循环元素组当没有在新定义数组里indexOf没要找到相同的值也就是等于-1时,就push到新数组里
function unique(arr) {
if(!Array.isArray(arr)){
return console.log('type error!')
}
var currentArr = []
for( var i = 0; i < arr.length; i++ ){
if (currentArr.indexOf(arr[i]) == -1){
currentArr.push(arr[i])
}
}
return currentArr
}
includes 查找新数组里是否包含相同的值
includes 用来查找数组中是否有指定元素的值,有就返回true
定义一个新的空数组,遍历传入数组的值是否包含在新数组中如果没有就push
function unique(arr){
var currentArr = []
for(var i=0; i<arr.length; i++){
if(!currentArr.includes(arr[i])){
currentArr.push(arr[i])
}
}
return currentArr
}
sort 排序之后对比相邻的两个元素
sort 通过把元素转换成字符串比较UTF-16值升序排列
定义一个新数组把传入数组第一个元素加入,将传入数组sort排序之后比较当前和前一个值是否不相同,不相同就push到新数组
function unique(arr) {
var currentArr = [arr[0]]
var arr = arr.sort()
for(var i=1; i< arr.length; i++ ){
if(arr[i] !== arr[i-1]){
currentArr.push(arr[i])
}
}
return currentArr
}
filter 过滤出 indexOf 查找到数组中值出现的第一个位置
filter 用于过滤出符合条件的的数组
function unique(arr) {
return arr.filter(function(item,index,arr) {
return arr.indexOf(item) === index
})
}
关于一些数组常用的API也可以看看我这篇总结
如果觉得对你有帮助,可以点赞收藏,有问题可以评论探讨~