资讯专栏INFORMATION COLUMN

js重用数组去重算法

stdying / 2761人阅读

摘要:原文地址方法一普通方法方法二实质上是方法一的变通版本创建一个目的数组,并把源数组的第一项添加到目的数组的第一项上面的方法可以简单处理或者或者方法三方法以空间换时间速度最快或者可以这样说明对象中已经存在这一项了,也就是说在数组中重复了

原文地址

方法一 普通方法
function unique1(srcArr) {
    let dstArr = []
    for (let i = 0; i < srcArr.length - 1; i++) {
        if (dstArr.indexOf(srcArr[i]) == -1) dstArr.push(srcArr[i])
    }
    return dstArr;
}
方法二 实质上是方法一的变通版本
function unique2(srcArr) {
    // 创建一个目的数组,并把源数组的第一项添加到目的数组的第一项
    let destArr = [srcArr[0]]
    for(let i = 1; i < srcArr.length - 1; i++) {
        if(srcArr.indexOf(srcArr[i]) == i) destArr.push(srcArr[i]);
    }
    return destArr;
}

// 上面的方法可以简单处理

function unique3(srcArr) {
    return srcArr.filter((v, i) => srcArr.indexOf(v) === i)
}
// 或者
function unique4(srcArr) {
    return srcArr.form(new Set(srcArr))
}
// 或者
function unique5(srcArr) {
    return [...new Set(this)];
}
方法三 hash方法 以空间换时间, 速度最快
function unique6(srcArr) {
    let tempMap = {}, dstArr = [];
    for(let i = 0; i < srcArr.length - 1; i++) {
        if(!tempMap[srcArr[i]]) {
            destArr.push(srcArr[i]);
            tempMap[srcArr] = true;
        }
    }
    return destArr
}

// 或者 可以这样

function unique7(srcArr) {
    var obj = {};
    for(var i = 0 ; i < srcArr.length; i++){
        var cur = srcArr[i];
        if(obj[cur] == cur){//说明对象中已经存在cur这一项了,也就是说在数组中重复了,删除就可以了
            // arr.splice(i,1); //用这个存在问题:后面每一项索引都改变,如果有1千万项,非常耗性能
            // 解决思路,我把数组末尾那一项的值拿过来,替换当前项,再把数组末尾那一项的值删除掉就行
            srcArr[i] = srcArr[srcArr.length-1];
            srcArr.length -- ;
            i --;//解决了数组塌陷问题
            continue;
        }
        obj[cur] = cur;
    }
}
方法四 排序后相邻去重

这个方法也能想到,当初面试的时候想到的就是这个方法

function unique8(srcArr) {
    srcArr.sort()
    let dstArr = [srcArr[0]];
    if(srcArr[i] !== destArr[destArr.length - 1]) destArr.push(srcArr[i]);
    return destArr;
}
方法五 优化遍历数组 其实这个方法跟第一个方法没什么区别
function unique9(srcArr) {
    let dstArr = []
    for(let i = 0; i < srcArr.length; i++) {
        for(let j = i + 1; j < srcArr.length; j++)
            if (srcArr[i] === srcArr[j]) j = ++i;
        destArr.push(srcArr[i]);    
    }
    return destArr;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100320.html

相关文章

  • JS程序

    摘要:设计模式是以面向对象编程为基础的,的面向对象编程和传统的的面向对象编程有些差别,这让我一开始接触的时候感到十分痛苦,但是这只能靠自己慢慢积累慢慢思考。想继续了解设计模式必须要先搞懂面向对象编程,否则只会让你自己更痛苦。 JavaScript 中的构造函数 学习总结。知识只有分享才有存在的意义。 是时候替换你的 for 循环大法了~ 《小分享》JavaScript中数组的那些迭代方法~ ...

    melody_lql 评论0 收藏0
  • js常见算法(一):排序,数组去重,打乱数组,统计数组各个元素出现的次数, 字符串各个字符的出现次数

    摘要:排序,数组去重,打乱数组,统计数组各个元素出现的次数,字符串各个字符的出现次数,获取地址链接的各个参数以后会记录自己解决过和遇到过的算法相关的题,系列一就以常见的开篇吧。 排序,数组去重,打乱数组,统计数组各个元素出现的次数, 字符串各个字符的出现次数,获取地址链接的各个参数 以后会记录自己解决过和遇到过的算法相关的题,系列一就以常见的开篇吧。 排序 本来想多列几个排序方法,但是其它都...

    DTeam 评论0 收藏0
  • JavasScript重难点知识

    摘要:忍者级别的函数操作对于什么是匿名函数,这里就不做过多介绍了。我们需要知道的是,对于而言,匿名函数是一个很重要且具有逻辑性的特性。通常,匿名函数的使用情况是创建一个供以后使用的函数。 JS 中的递归 递归, 递归基础, 斐波那契数列, 使用递归方式深拷贝, 自定义事件添加 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果...

    forsigner 评论0 收藏0
  • 【译】JS基础算法脚本:类数组(arguments)去重

    摘要:参数用来测试数组的每个元素的函数。调用时使用参数。返回表示保留该元素通过测试,则不保留。执行时的用于的值。那些没有通过测试的元素会被跳过,不会被包含在新数组中。有其他好的方法或思路的道友,不妨在沙发区神交一番。 需求 给出一个类数组,删除要求的重复数据,返回新数组 destroyer([1, 2, 3, 1, 2, 3], 2, 3) should return [1, 1] dest...

    mrcode 评论0 收藏0
  • JS数组专题2️⃣ ➖ 数组去重

    距离上次发文,已经有一段时间了,最近工作比较忙,这不眼看快双十一了,就相当于给大家一些福利吧! showImg(https://segmentfault.com/img/remote/1460000016538082?w=250&h=250); 一、什么是数组去重 简单说就是把数组中重复的项删除掉,你 GET 到了吗 ?下面我将简单介绍下几种基本的方法及其优缺点。 二、方法汇总 两层循环 无相同...

    tunny 评论0 收藏0

发表评论

0条评论

stdying

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<