首页 > 解决方案 > 无法访问对象属性的值

问题描述

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

这是我的循环功能:

  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;
    })
  }

firstName并且surname工作正常,但在最后一个 if 语句中我得到undefined. 带有键的属性phoneNumbers是一个对象数组,这是数组中的项目0

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

当我改用此代码时:

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

最后我没有把整个对象恢复得很好,我只是不能从对象中.number取回属性。number

更新

仔细观察,这个包含 800 多个大型对象的数组,其中一些phoneNumbers数组的长度是0不存在的。这导致整个功能失败。感谢以下评论。

我的解决方案是添加到 if 语句:

if (key === 'phoneNumbers' && contact[key].length)

标签: javascript

解决方案


您可以像这样防止空的 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>


推荐阅读