js数组去重(含对象)_sortobjkeytostring-程序员宅基地

技术标签: 对象  数组去重  前端  js  javascript  

难点:对象是无序的

关键:利用对象属性

核心:对象根据key排序后通过JSON.stringify转换,构造唯一的对象属性

输入:

unique([0,0,'','',{},{},null,null,undefined,undefined,false,false,true,true,NaN,NaN,{a:1}, 1,1,'1',2,3,4,4, {a:1}, {a:1,b:2}, {b:2,a:1}, {a: {y:2,x:1}, b:3}, {b:3, a: {x:1,y:2}}])

代码:

function unique(arr) {
    var obj = {};
    for(var i=0; i<arr.length; i++) {
        var item = arr[i];
        var t = typeof(item);
        switch(t){
            case 'object':
                var o = sortObjKey(item);//排序后的对象
                obj[JSON.stringify(o)] = item;
                break;
            case 'number'://区分不同类型的值,例如:1和'1'
                obj['n_' + item] = item;
                break;
            case 'string'://区分不同类型的值,例如:1和'1'
                obj['s_' + item] = item;
                break;
            default:
                obj[item] = item;
                break;
        }
    }
 
    var newArr = [];
    for(var attr in obj) {
        newArr.push(obj[attr]);
    }
    
    return newArr;
}

// 对象根据Key排序
function sortObjKey(obj) {
    if(obj === null) return obj;
    var keys = Object.keys(obj).sort();
    var o = {};
    for(var i = 0; i < keys.length; i++) {
        var k = keys[i];
        var v = obj[k];
        if(typeof(v) === 'object') {
            o[k] = sortObjKey(v); // 递归
        } else {
            o[k] = v;
        }
    }

    return o;
}

输出:

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/carfge/article/details/116567247

智能推荐

go build 命令-程序员宅基地

简介用于编译源码文件或代码包 编译非命令源码文件不会产生任何结果文件编译命令源码文件会在该命令的执行目录中生成一个可执行文件执行该命令且以若干源码文件作为参数时,只有这些文件会被编译 注意列出代码运行所需的全部源码文件,否则可能产生编译错误执行该命令且不追加任何参数时,它会试图把当前目录作为代码包并编译执行该命令且以代码包的导入路径作为参数时,该代码包及其依赖会被编译

思科路由器的时间配置_思科修改时间命令-程序员宅基地

思科路由器时间配置设置时间及时区命令如下:1.设置时区:Router(config)#CLOCK Timezone beijing +08 //设置为北京的时区为东8区2.设置时间:Router# clock set 10:00:00 Aug 4 2015 //设置时间为2015年8月4日10时整3.设置网络时间:Router(config)#ntp server s1b.tim..._思科修改时间命令

Quake3场景管理技术研究报告_quake3 d3d-程序员宅基地

Quake3场景管理技术研究报告作者:cywater2000来自:http://blog.csdn.net/cywater2000(转载请注明出处)版本信息:v1.00 2005-12-31 完成基本框架 v1.02 2006-01-04 修改v1.05 2006-01-06 增加了第四部分v1.06 2006-01-11 大概完成v1.07 2006-_quake3 d3d

mysql中的json查询_mysql json字段查询-程序员宅基地

参考文章MySQL 5.7新增对JSON支持1,json格式处理方式:select * from log where data->'$.id' = 142;或 select data->'$.id' id,data->'$.name' name from log where data->'$.id' = 142;2,json数组格式select name from country where JSON_EXTRACT(name, '$[1]') LIKE '_mysql json字段查询

Cookies 和 Session的区别-程序员宅基地

1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据。 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间。 Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服...

CSR_IOS_2.1中frameworks的添加流程-程序员宅基地

今天把CSRmeshDemo运行测试了一下,感觉项目有点复杂,不利于拓展,有时候还是需要将第三方框架抽离出来重新创建项目或者添加到已有的项目中,下面是本人自己新建项目重新添加框架的流程,有什么错误还请指出,互相学习一下;好了,不多说,直接开始。第1步:创建新项目 我是新建了项目,名为TestCSRmeshDemo,并且创建了一个Podfile文件,将所需要的第三方库pod进来,至于pod操作相信大

随便推点

Paint 画笔的一些属性_paint 里面的画笔都是什么意思-程序员宅基地

Paint(画笔):就是画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等 直接使用无参构造方法就可以创建Paint实例: Paint paint = new Paint( );我们可以通过下述方法来设置Paint(画笔)的相关属性,另外,关于这个属性有两种, 图形绘制相关与文本绘制相关:setARGB(int a,int r,int g,int b): 设置绘制的颜色,_paint 里面的画笔都是什么意思

使用pip安装的几个技巧-程序员宅基地

File "/usr/local/lib/python3.6/site-packages/pip/_vendor/urllib3/response.py", line 402, in _error_catcherraise ReadTimeoutError(self._pool, None, 'Read timed out.')pip._vendor.urllib3.excepti...

我的世界服务器玩家在线指令,我的世界指令大全:管理自己或者其他玩家及管理服务器指令...-程序员宅基地

/time set day 白天/weather 设定天气/toggledownfall 切换天气/gamerule domobspawning false/gamerule domobspawning true开启/关闭生物自然生成/gamerule 设定或查询一个游戏规则值/difficulty 设定难度/help 提供命令的帮助/gamerule规则名是否开启这个规则 true为开启,fal..._/gamerule drowningdamage true

init() 方法-程序员宅基地

1 /** 2 * servlet init()在web应用程序启动之后,第一个请求到达Servlet之前调用。 3 * 问题1:如果init()中需要处理大量的工作,那么servlet在处理第一个请求需要花费大量的时间 4 * 解决1:在web.xml配置文件中添加配置问题<load-on-startup>1</load-on-s..._init方法在servlet处理第一个请求之前调用

Future和CompletableFuture解析与使用-程序员宅基地

一、Future模式Java 1.5开始,提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。Future接口可以构建异步应用,是多线程开发中常见的设计模式。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调用者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,则可以...

Intellij IDEA安装过程-程序员宅基地

第一步:idea官网下载:https://www.jetbrains.com/idea/download/#section=windows左侧为旗舰版,右侧社区版,一般下载旗舰版,exe文件:需要在线安装zip文件:离线包,无需安装,解压即可第二步:安装第三步:激活三种激活方式,在这里选择Activation code,① 下载破解补丁JetbrainsCrac...