注意一点:在JavaScript中,有一个值和它自身不相等。
NaN === NaN // false
null === null // true null实际上是等于自身的
对于引用类型来说。本身[]和[]就不相等(指向的空间是独立的),所以两个相同的[]实际上是不同的,不用去。
Set对象是可以去除多余的NaN,只保留一个的。
set对象专门去重
console.log([...new Set(arr)])
扩展数组方法
Array.prototype.filterOverlap = function(){
let temp = [];
if(!this.length){
return []
}
for(let i=0,len=this.length;i<len;i++){
if(temp.indexOf(this[i])<0){
temp.push(this[i])
}
}
return temp;
}
reduce方法去重,去掉的是对象的key相同的
// reduce去重方法
// reduce可以设置第二个参数:prev的默认类型和初始值
let person = [
{id: 0, name: "小明"},
{id: 1, name: "小张"},
{id: 2, name: "小李"},
{id: 3, name: "小孙"},
{id: 1, name: "小周"},
{id: 2, name: "小陈"},
]
let obj = {};
person = person.reduce((prev, next) => {
obj[next.id] ? "" : obj[next.id] = true && prev.push(next)
return prev
}, [])
去除数组中的空值(只针对基本类型)
let arr = [1,2,"", " ", 0 , -1, null, undefined, false, true, NaN];
let tmp = arr.filter((item) => {
if(typeof item === 'string'){
return item.trim()
}
return item
})
根据对象的key值不能相同的情况去重
// 做法:先将数组转化成对象,再转化成数组
// 这种方法的缺点:将所有的数字都转化成字符串了;相同的数字和字符串去重时,只能剩下一个字符串
var arr = [1,"1", 4, 12, 6, 23, 2, 5, 2, 1, 3, 5, 26, 7]
var toObject = function (arr) {
var obj = {}
for (var i = 0; i < arr.length; i++) {
obj[arr[i]] = true;
}
return obj;
}
var toArray = function (obj) {
var arr = []
for(var i in obj){
arr.push(i)
}
return arr
}
var uniq = function(arr){
return toArray(toObject(arr))
}
console.log(uniq(arr));
网友评论