Вы можете использовать Map
для хранения своих отдельных контактов, создав собственный составной ключ:
const contacts = [
{
name: "Name",
email: "email@example.com",
phone: "5551212",
organization: "BigCompany",
title: "CEO"
},
// ...
]
// Store distinct contacts.
const map = new Map()
contacts.forEach((c) => {
/**
* Any contact with the same name, email, and phone will
* be considered a duplicate.
*/
const key = `${c.name}::${c.email}::${c.phone}`
map.set(key, c)
})
Теперь ваша карта представляет собой контейнер предметов { key => contact }
.
Чтобы получить список отдельных контактов, используйте:
const list = Array.from(map.values())
// Use spread syntax to accoplish the same thing.
const list2 = [...map.values()]
Примечание: использование разделителя ::
может считаться небезопасным, если имя, адрес электронной почты или номер телефона могут содержать эту подстроку. Какой бы разделитель вы ни использовали, вы должны по возможности запретить его ввод в эти поля и / или сделать так, чтобы вероятность его появления на входе была крайне маловероятной:
const delim = '__:DELIM:__'
const key = `${c.name}${delim}${c.email}${delim}${c.phone}`
Тем не менее, нет 100% гарантии, что разделитель не появится в таком поле, как name
, если вы не выполните проверку ввода для этого поля.
РЕДАКТИРОВАТЬ: На экзамене T.J. JSON-ключ Crowder, использование этого метода для генерации вашего ключа обеспечит хорошую гарантию отсутствия проблем с подстрокой:
const key = JSON.stringify({name, email, phone});
map.set(key, c)