2016-07-21 1 views
-1

Я получаю ответ от сервера, как этогоКак сохранить только уникальный объект в массиве объектов с помощью JavaScript

{ 
    owners:[ 
    { 
    _id:"33333" 
    email:[email protected] 
    } 
    { 
    _id:"1111" 
    email:[email protected] 
    }] 
    employee:[ 
    { 
    _id:"44342" 
    email:[email protected] 
    } 
    { 
    _id:"35345" 
    email:[email protected] 
    } 
    { 
    _id:"3556" 
    email:[email protected] 
    } 
    ] 
    users:[ 
    { 
    _id:"56744" 
    email:[email protected] 
    } 
    { 
    _id:"8908" 
    email:[email protected] 
    }] 
} 

я хочу сохранить объекты, которые только имеющие уникальный электронных идентификатора во все массив объектов Результат должен быть таким:

{ 
    owners:[ 
    { 
    _id:"33333" 
    email:[email protected] 
    } 
    { 
    _id:"1111" 
    email:[email protected] 
    }] 
    employee:[ 

    { 
    _id:"35345" 
    email:[email protected] 
    } 
    { 
    _id:"35345" 
    email:[email protected] 
    } 
    ] 
    users:[ 
    { 
    _id:"56744" 
    email:[email protected] 
    } 
] 
} 

может кто-нибудь помочь мне на этом Пожалуйста.

+0

Какую копию дубликатов вы хотите сохранить, первую? Потому что _id уникальны и что inof будет потерян навсегда. –

ответ

0

Ну, есть несколько способов сделать это. Одним из самых простых было бы использование библиотек, таких как lodash или underscore, и использование метода 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); 
} 
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'); 

То же самое с работниками.