JavaScript数组去重

2019-06-27  本文已影响0人  椰果粒

注意一点:在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));
上一篇 下一篇

猜你喜欢

热点阅读