Уничтожение объектов - PullRequest
0 голосов
/ 14 мая 2018

Как я могу написать этот код более элегантным способом.Я посмотрел на 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)
    }

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете определить 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 (улучшает читабельность кода).

...