无法访问对象属性的值

时间:2019-08-21 13:51:35

标签: javascript

我正在遍历一个对象以检索某些属性,但是由于某些原因,我无法访问嵌套对象属性的值。

这是我的循环功能:

  parseContacts = (contacts) => {
    return contacts.map(contact => {
      let parsedContact = {};
      Object.keys(contact).forEach(key => {
        if (key === 'givenName') {
          parsedContact.firstName = contact[key];
        } if (key === 'familyName') {
          parsedContact.surname = contact[key];
        } if (key === 'phoneNumbers') {
          parsedContact.phoneNumber = contact[key][0].number;
        }
      })
      return parsedContact;
    })
  }

firstNamesurname可以正常工作,但是在最后一个if语句中,我得到undefined。关键字为phoneNumbers的属性是一个对象数组,这是数组中的项目0

{id: "302", label: "mobile", number: "+44 7X7X 50XX72"}

当我改用此代码时:

} if (key === 'phoneNumbers') {
          parsedContact.phoneNumber = contact[key][0];
        }

最后没有.number的情况下,我使整个对象恢复正常,只是无法从对象中恢复<{>} 属性。

更新

经过仔细检查,其中包含800多个大对象的数组,number数组的某些长度为phoneNumbers,因此该属性不存在。这导致整个功能失败。感谢您的以下评论。

我的解决方案是在if语句中添加

0

1 个答案:

答案 0 :(得分:0)

您可以防止出现空白的phoneNumbers数组问题:

contact[key] && contact[key].length ? contact[key][0].number : ''

const parseContacts = contacts => {
    return contacts.map(contact => {
      let parsedContact = {}
      Object.keys(contact).forEach(key => {
        switch (key) {
          case 'givenName':
            parsedContact.firstName = contact[key]
            break
          case 'familyName':
            parsedContact.surname = contact[key]
            break
          case 'phoneNumbers':
            parsedContact.phoneNumber = contact[key] && contact[key].length ? contact[key][0].number : ''
        }
      })
      return parsedContact
    })
}
  
const contacts = []

for (let i = 0; i < 10; i++) {
   contacts.push({
      givenName: faker.name.firstName(),
      familyName: faker.name.lastName(),
      phoneNumbers: [
        {
         id: faker.random.uuid(),
         label: 'mobile',
         number: faker.phone.phoneNumber()
        }, {
         id: faker.random.uuid(),
         label: 'mobile',
         number: faker.phone.phoneNumber()
        }
      ]
   })
}

 contacts.push({
    givenName: faker.name.firstName(),
    familyName: faker.name.lastName(),
    phoneNumbers: []
 })
 
  contacts.push({
    givenName: faker.name.firstName(),
    familyName: faker.name.lastName(),
    phoneNumbers: null
 })

console.log('RESULT ' + JSON.stringify(parseContacts(contacts)))
<script src="https://rawgit.com/Marak/faker.js/master/examples/browser/js/faker.js"></script>