Уничтожение объектов

58
5

Как я могу написать этот код более элегантным способом. Я посмотрел на lodash и т.д., Но не смог найти лучший способ разрушить объект для моих нужд. Поскольку я напишу эти свойства на монго, я также попытался проверить, существуют ли они или нет.

 const { _id, name, bio, birth_date, photos, instagram, gender, jobs, schools } = element
let myPhotos = photos.map((photo) => photo.id)
let insta = {}
if (instagram) {
insta.mediaCount = instagram.media_count
insta.profilePicture = instagram.profile_picture
insta.username = instagram.username
insta.photos = instagram.photos.map((photo) => photo.image)
}

const doc = {}

doc._id = ObjectId(_id)
doc.name = name
doc.birthDate = new Date(birth_date)

if (bio.length) {
doc.bio = bio
}
if (myPhotos.length) {
doc.photos = myPhotos
}
if (Object.keys(insta).length) {
doc.instagram = insta
}
doc.gender = gender

if (jobs.length) {
doc.jobs = jobs
}

if (schools.length) {
doc.schools = schools
}

try {
await collection.insertOne(doc)
} catch (error) {
console.log("err", error)
}

спросил(а) 2018-05-14T03:53:00+03:00 2 года, 5 месяцев назад
1
Решение
81

Вы можете определить doc все сразу, используя тернарный оператор для проверки условий. Если undefined свойства нужно удалить, вы можете удалить их с последующим reduce.

const { _id, name, bio, birth_date, photos, instagram, gender, jobs, schools } = element
const myPhotos = photos.map(({ id }) => id)
const insta = !instagram ? undefined : (() => {
const { media_count, profile_picture, username, photos } = instagram;
return {
mediaCount: media_count,
profilePicture: profile_picture,
username,
photos: photos.map(({ image }) => image)
}
})();
const docWithUndef = {
_id: ObjectId(_id),
name,
gender,
birthDate: new Date(birth_date),
bio: bio.length ? bio : undefined,
photos: myPhotos.length ? myPhotos : undefined,
instagram: insta,
jobs: jobs.length ? jobs : undefined,
schools: schools.length ? schools : undefined,
}
const doc = Object.entries(docWithUndef)
.reduce((accum, [key, val]) => {
if (val !== undefined) accum[key] = val;
return accum;
});
try {
await collection.insertOne(doc)
} catch (error) {
console.log("err", error)
}

Обратите внимание на деструктурирование аргументов для уменьшения синтаксического шума и использование const а не let (улучшает читаемость кода).

ответил(а) 2018-05-14T04:33:00+03:00 2 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема