如何使用javascript仅在对象数组中保留唯一对象

时间:2016-07-21 09:53:58

标签: javascript node.js underscore.js lodash

我从服务器那里得到响应

{
    owners:[
    {
    _id:"33333"
    email:test1@gmail.com
    }
    {
    _id:"1111"
    email:test2@gmail.com
    }]
    employee:[
     {
    _id:"44342"
    email:test1@gmail.com
    }
    {
    _id:"35345"
    email:test3@gmail.com
    }
     {
    _id:"3556"
    email:test4@gmail.com
    }
    ]
    users:[
    {
    _id:"56744"
    email:test5@gmail.com
    }
    {
    _id:"8908"
    email:test4@gmail.com
    }]
}

我想保留在所有对象数组中只有唯一电子邮件 ID的对象,结果应该是这样的:

{
    owners:[
    {
    _id:"33333"
    email:test1@gmail.com
    }
    {
    _id:"1111"
    email:test2@gmail.com
    }]
    employee:[

    {
    _id:"35345"
    email:test3@gmail.com
    }
     {
    _id:"35345"
    email:test4@gmail.com
    }
    ]
    users:[
    {
    _id:"56744"
    email:test5@gmail.com
    }
]
}

任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

由于您需要跨两个数组的唯一性,因此必须先将它们组合在一起。

let combined = result.owners.map(o => {o.type = 'owner'; return o;})
            .concat(result.users.map(u => {u.type = 'user'; return u;});
combined = _.uniqBy(combined, 'email');

result.owners = _.filter(combined, {type: 'owner');
result.users = _.filter(combined, {type: 'user');

与员工一样。

答案 1 :(得分:0)

有几种方法可以做到这一点。其中最简单的方法是使用lodashunderscore等库,并使用uniq方法根据属性过滤掉重复的对象。

使用下划线作为示例来获取所有者对象的唯一列表:

_.uniq(owners, 'email')

或者这种功能也可以起作用:

function uniqeValues(objects, property) {
     let unique_values = {};

     objects.forEach(object=> {
         if (!unique_values.hasOwnProperty(object[property])) {
             unique_values[object[property]] = object;
         }
     });

     return Object.values(unique_values);
}