首页 > 解决方案 > JS数组映射函数,无法读取未定义的属性

问题描述

我有一个复杂的 JS 对象和属性数组。其中一些返回值,但有些返回空值,问题是当我通过列表进行映射时,只要有空值就会导致错误。

我现在无法过滤掉数组,因为我已经在一个循环中,不应该创建另一个过滤数组。我最好的方法是什么?我希望我的循环返回 Array.Group.name[0].text,如果它不存在,则返回 null。

const x = [
      {
        "id": "1",
        "Groups": [
          {
            "name": [
              {
                "language": "en-US",
                "text": "REGULAR_TIME"
              }
            ],
            "isSystem": true
          },
          {
            "name": [
              {
                "language": "en-US",
                "text": "CHARGEABLE"
              }
            ],
            "isSystem": true
          }
        ]
      },
      {
        "id": "2",
        "Groups": [
          {
            "name": [
              {
                "language": "en-US",
                "text": "REGULAR_TIME"
              }
            ],
            "isSystem": true
          },
          {
            "name": [
              {
                "language": "en-US",
                "text": "CHARGEABLE"
              }
            ],
            "isSystem": true
          }
        ]
      }
      ]
      
      x.map(y=>y.Groups.name[0].text)
      
      console.log(x) 

标签: javascriptarrays

解决方案


Groups也是一个数组,所以你必须使用索引来访问它的成员,比如Groups[0]. 目前尚不清楚Groups您想要获得的元素的名称。

大概,你的意思是 x.map(y=>y.Groups[0].name[0].text)

Groups作为一个数组也是一个对象。所以Groups.name没有给你任何东西,因为这样的属性不存在。

let x = [
      {
        "id": "1",
        "Groups": [
          {
            "isSystem": true
          },
          {
            "name": [
              {
                "language": "en-US",
                "text": "CHARGEABLE"
              }
            ],
            "isSystem": true
          }
        ]
      },
      {
        "id": "2",
        "Groups": [
          {
            "name": [
              {
                "language": "en-US",
                "text": "REGULAR_TIME"
              }
            ],
            "isSystem": true
          },
          {
            "name": [
              {
                "language": "en-US",
                "text": "CHARGEABLE"
              }
            ],
            "isSystem": true
          }
        ]
      }
      ];
      
      
      console.log(x.map(y => y.Groups[0].name?.[0].text));

      // or just filter the absent names out before the main routine.
      console.log(x.filter(y => y.Groups[0].name).map(y => y.Groups[0].name?.[0].text));


推荐阅读