数组去重6大方法

性能逐渐递减
// 1

function distinct(a, b) {
    let arr = a.concat(b)
    let result = [] // 保存去重后的结果
    let obj = {} // 利用对象属性唯一的特性来判断数组元素是否已经存在了

    for (let i of arr) { // i就是数组的当前元素的值
        if (!obj[i]) { // obj[i]表示获取obj的属性i的值,i就是数组的当前元素
            result.push(i)  //将去重后的元素保存在result新数组里
            obj[i] = 1 // 将刚才得到的唯一的元素作为obj的属性名,并给其赋值,这样!obj[i]得到的值就是false,那么重复的值不会进入if判断
        }
    }

    return result
}

// 2

function distinct(a, b) {
    let arr = a.concat(b)
    arr = arr.sort() // 先对合并后的数组进行排序
    let result = [arr[0]] // 取出第一个元素,肯定是不重复的
    for (let i=1, len=arr.length; i<len; i++) {
        arr[i] !== arr[i-1] && result.push(arr[i]) // 判断如果和下一位不相等就push进新数组
    }
    return result
}

// 3

function distinct(a, b) {
  // ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
  // Set函数可以接受一个数组作为参数,用来初始化。
    return Array.from(new Set([...a, ...b])) // new Set内的数据都是唯一的, Array.from将set实例对象转成真正的数组
}

// 4

function distinct(a, b) {
    let arr = a.concat(b)
    let result = [] // 创建新数组用来保存结果
    for (let i of arr) {
      // 数组的includes方法可以判断数组中是否已经包含了该元素
        !result.includes(i) && result.push(i)
    }
    return result
}

// 5

function distinct(a, b) {
    let arr = a.concat(b);
    // filter()返回一个新数组,新数组中是所有通过callback函数测试的元素。是过滤后的元素。
    return arr.filter((item, index)=> {
      // indexOf方法返回第一次找到该元素的索引,如果该索引和当前索引相同就是第一次出现
        return arr.indexOf(item) === index // 返回的是true or false  ,如果是true,返回该元素item
    })
}

// 6

function distinct(a, b) {
    let arr = a.concat(b);
    for (let i=0, len=arr.length; i<len; i++) {
        for (let j=i+1; j<len; j++) {
            // 将当前元素和下一个元素进行比较
            if (arr[i] == arr[j]) { // 如果相等,就是重复元素
                arr.splice(j, 1); // 从索引j开始删除,删除1个,就是索引j本身
                // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
                len--;
                j--;
            }
        }
    }
    return arr
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值