js数组去重

对于如下对象数组

[{id: 0, name: "name1"}, {id: 1, name: "name2"},{id: 1, name: "name2"},{id: 1, name: "name2"}, {id: 2, name: "name3"}, {id: 0, name: "name4"}]

现在想要将id相同的对象的name拼起来,笨的算法如下:

var ids = [];
        var ret = [];
        var map = {};
        var arr = [{id: 0, name: "name1"}, {id: 1, name: "name2"},{id: 1, name: "name2"},{id: 1, name: "name2"}, {id: 2, name: "name3"}, {id: 0, name: "name4"}];        //循环调用
        for (let i = 0; i < arr.length; i++) {
            map["" + arr[i].id] = arr[i];
        }
        var mulObj = {};
        var mulArr = [];
        for (var i = 0; i < arr.length; i++) {
            var obj = arr[i];   //当前对象
            if (ids.indexOf(obj.id) != -1) {          //如果包含,先取出该对象,然后遍历查找重复对象
                mulObj = map["" + obj.id];        //重复的对象+obj已有对象-----合并
                mulArr.push(mulObj);
            } else {
                ids.push(obj.id);
                ret.push(obj);
            }
        }
        for (let i = 0; i < ret.length; i++) {
            for(let j=0;j<mulArr.length;j++){
                if(ret[i].id == mulArr[j].id){      //说明重复
                    ret[i].name += mulArr[j].name;
                }
            }
        }
        console.log(ret);

对于形如这种字符串或数字数组去重:

[1,2,3,4,2,6,3,2,6,6,8]

简单算法实现如下:

let ret = [];
let hash = {};
for (let i = 0; i < arr.length; i++) {
    let item = arr[i];
    let key = typeof(item) + item;
    if (hash[key] !== 1) {
        ret.push(item);
        hash[key] = 1;
    }
}
return ret;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维技术迷

连仕彤博客[Python笔记] locals() 函数

1303
来自专栏每日一篇技术文章

Swift3.0 - 初始化和释放

1.系统要求存储属性必须初始化 2.可选值可以不用初始化,如果不初始化值,系统默认用nil初始化它 3.如果非可选类型存储属性不设置默认值,则必须在初始化方...

541
来自专栏猿人谷

JDK1.7源码分析01-Collection

同步发布:http://www.yuanrengu.com/index.php/20180221.html Java的集合类主要由两个接口派生而出:Collec...

3145
来自专栏令仔很忙

集合详解(一)----Collection和Map接口

在我们编程的时候,有时候需要集中存放多个数据,可以用数组来保存多个数据,但是数组的长度是不可变的,一旦数组的长度确定了之后就无法再改变,如果要保存可变长度的数...

602
来自专栏一“技”之长

深入理解JavaScript函数 原

    从功能上理解,函数是一组可以随时运行的语句,是一段代码块,也是所谓的子程序。在JavaScript中,函数实质上也是一种对象,是Function对象。函...

421
来自专栏Java编程技术

一个有关定时生产与消费的问题

按照上面的逻辑看的话,每个队列里面最多有一个元素。其实不然,因为在多线程模型中每个线程占用cpu执行的时间是按照时间片来划分的,每个线程执行完自己的时间片后会被...

511
来自专栏前端架构

null和""以及==与equals的区别——最全面的解答

3、==一般不用来比较字符串,因为就算字串内容相同,但是地址是不一样的,所以==比较字符串存在风险

1022
来自专栏郭耀华‘s Blog

Java集合框架(一)—— Collection、Iterator和Foreach的用法

1.Java集合概述   在编程中,常常需要集中存放多个数据。当然我们可以使用数组来保存多个对象。但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长...

3099
来自专栏杨龙飞前端

js中的valueOf与toString

2594
来自专栏Ryan Miao

java继承覆盖与向上转型,权限

子类可以覆盖父类的非final成员变量和重写非final方法 private私有变量和方法只能在类的内部使用,因此子类继承的同时会被隐藏,相当于不继承 prot...

28710

扫码关注云+社区