Как добавить в масив только уникальные обьекты ?

148
25 июня 2019, 18:40

У меня есть масив с обьектами:

 let arr = [
     { name: 'Jahn',
       email: 'john@test.com'
     },
     { name: 'Bob',
       email: 'bob@test.com'
     }
]

Мне нужно добавлять обьекты. Как мне добавлять только уникальные обьекты. Например как из такого масива добавить только уникальные обьекты ?

let arr2 = [
         { name: 'Max',
           email: 'max@test.com'
         },
         { name: 'Bob',
           email: 'bob@test.com'
         },
         { name: 'Jahn',
           email: 'john@test.com'
         },
         { name: 'Julie',
           email: 'julie@test.com'
         }
    ]

Должен получиться такой масив в результате:

let result = [
          { name: 'Jahn',
            email: 'john@test.com'
          },
          { name: 'Bob',
            email: 'bob@test.com'
          },
          { name: 'Max',
           email: 'max@test.com'
          },
          { name: 'Julie',
            email: 'julie@test.com'
          }
     ]

Уникальное свойство у обьекта это email

Answer 1

Ну как-то так, получился довольно длинный пример, все можно было и записать одной функцией, но я разделил на целых 3. Моей целью было показать алгоритм а красиво оформить думаю сами сможете.

let arr1 = [ 
    {  
        name: 'Jahn', 
        email: 'john@test.com' 
    }, 
    {  name: 'Bob', 
        email: 'bob@test.com' 
    } 
]; 
 
let arr2 = [ 
    { 
        name: 'Max', 
        email: 'max@test.com' 
    }, 
    { 
        name: 'Bob', 
        email: 'bob@test.com' 
     }, 
     {  
        name: 'Jahn', 
        email: 'john@test.com' 
     }, 
     {  
        name: 'Julie', 
        email: 'julie@test.com' 
     } 
]; 
 
function array2object(array, field){ 
    let res = {}; 
     
    for(let i in array) 
        if (!(i in res)) 
            res[array[i][field]] = array[i]; 
     
    return res; 
} 
 
function object2array(object) 
{ 
    let res = []; 
     
    for(let i in object) 
        res.push(object[i]); 
     
    return res; 
} 
 
function union(arr1, arr2) 
{     
    for (let i in arr2) 
        if (!(i in arr1))   
            arr1[i] = arr2[i]; 
         
    return arr1; 
} 
 
// первый параметр это сам массив а второй уникальное поле  
// которое будет ключом 
let obj1 = array2object(arr1, 'email'); 
let obj2 = array2object(arr2, 'email'); 
 
let result = object2array(union(obj1, obj2)); 
 
console.log(result);

Answer 2

Вот еще один вариант.

const arr = [{ 
    name: 'Jahn', 
    email: 'john@test.com' 
  }, 
  { 
    name: 'Bob', 
    email: 'bob@test.com' 
  } 
] 
 
const arr2 = [{ 
    name: 'Max', 
    email: 'max@test.com' 
  }, 
  { 
    name: 'Bob', 
    email: 'bob@test.com' 
  }, 
  { 
    name: 'Jahn', 
    email: 'john@test.com' 
  }, 
  { 
    name: 'Julie', 
    email: 'julie@test.com' 
  } 
] 
 
function addUnique(arrTarget, arrSource, field) { 
  const res = arrTarget.splice(); 
  arrSource.forEach(f => { 
    if (!res.some(s => s[field] === f[field])) 
      res.push(f); 
  }); 
  return res; 
} 
const res = addUnique(arr, arr2, 'email'); 
console.log(res);

READ ALSO
Не срабатывает событие изменения sessinStorage

Не срабатывает событие изменения sessinStorage

При монтировании компонента устанавливаю обработчик изменения сессионного хранилища

115
Ошибка при запуске Service Worker PWA

Ошибка при запуске Service Worker PWA

Внедряю на сайт PWAПри запуске Service Worker возникает следующая ошибка:

145
Вызов модального окна ajax запросом

Вызов модального окна ajax запросом

Пытаюсь вызвать модальное окно с помощью ajax запроса но есть проблемаОкно по нажатию на кнопку вызывается только со 2 раза и после не закрывается...

121