Функция отображения массива JS, не может прочитать свойство неопределенного

#javascript #arrays

Вопрос:

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

Я не могу отфильтровать массив прямо сейчас, потому что я уже нахожусь в цикле и не должен создавать другой отфильтрованный массив. Каков был бы мой лучший подход? Я хочу, чтобы мой цикл возвращал массив.Group.name[0].текст, и если его там нет, просто верните значение 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) 
 

Ответ №1:

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

Комментарии:

1. x.карта(y=>y.Группы[0].имя[0].текст Да, это точные данные, которые я пытаюсь получить, и у меня эта ошибка. Итак, как бы я получил доступ к элементам, когда Groups.name не доступен?

2. Я добавил пример, когда name его нет. Это дает просто неопределенный конечный результат, но вы можете реализовать любое значение с помощью if map обратного вызова check in.

3. @WildThing также я добавил предварительную фильтрацию, чтобы получить только элементы, в которых name присутствует свойство.

Ответ №2:

вот в чем проблема ! Groups является ли массив таким :

 let result = [];
  for (i=0; i<x.length;i  ){
    for(j=0;j<x[i].Groups.length;j  ){
      result.push(x[i].Groups[j].name[0].text)
    }
  }
 

этот цикл возвращает результат, содержащий массив текста

или вы можете попробовать это :

 x.forEach(el=>{
    el.Groups.forEach(v=>{
      result.push(v.name[0].text)
    })
  })