Как я могу извлечь элементы и свойства из данного JSON

#javascript #arrays #json #reactjs #object

Вопрос:

Как я могу получить доступ к каждому из свойств в данном JSON?

Я также хотел бы отфильтровать конкретные объекты на основе их идентификаторов. Как это сделать с помощью метода array.filter в javascript?

 {
    "records": [
        {
            "id": "abcd",
            "fields": {
                "term": [
                    "xyz"
                ],
                "groupId": 888,
                "url": "https://www.facebook.com",
                "url_c": [
                    "https://www.google.com"
                ],
                "pID": [
                    "1800"
                ],
                "location": [
                    "mumbai"
                ],
                "url_location": [
                    "https://www.mumbai.com/"
                ]
            },
            "createdTime": "2021-05-12T10:18:33.000Z"
        }
    ]
}
 

В настоящее время я пытаюсь это сделать:

 const [info, setInfo] = useState({});

  useEffect(() => {
    fetch(
      "https://apiurl//"
    )
      .then((res) => res.json())
      .then((data) => {
        setInfo(data.records);
        console.log(data);
      })
      .catch((error) => {
        console.log(error);
      });
  }, []);

let resultInfo = info.filter((x) => x.groupId == gid);
console.log(resultInfo[0].fields.groupId);
 

Но это показывает ошибку

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

1. Не по теме: поскольку выборка выполняется асинхронно, ответ может прийти после отключения компонента. Вам нужно убедиться setInfo , что в этом случае вы не позвоните. Рассмотрите возможность использования github.com/streamich/react-use/blob/master/docs/useAsync.md , он обрабатывает все, что находится под капотом.

2. Не могли бы вы предоставить более подробную информацию об этом вопросе, как о том, что на самом деле представляет собой gid? Скорее всего, вы все делаете правильно, за исключением нескольких вещей, которые необходимо изменить, которые можно распознать, как только у нас будет вся информация. Спасибо

Ответ №1:

Вы инициализируете свой info как пустой объект. Таким образом, ваш код пытается запустить filter объект, который вернет ошибку. Также в вашем фильтре проверка неверна на основе примера json, которым вы поделились

Тебе следует измениться

 const [info, setInfo] = useState({});

let resultInfo = info.filter((x) => x.groupId == gid);
 

Для

 const [info, setInfo] = useState([]);

let resultInfo = info.filter((x) => x.fields.groupId == gid);
 

Ответ №2:

Поскольку это асинхронно, либо определите вещи в методе .then (), либо вы можете просто использовать asyn await, чтобы все работало на вас.

Что-то вроде

 const [info, setInfo] = useState([]);
  useEffect(() => {
    fetch(
      "https://apiurl//"
    )
      .then((res) => res.json())
      .then((data) => {
    if(data amp;amp; data.records){
        console.log(data);
        const records = data.records.filter((x) => x.fields.groupId == gid);
        setInfo(records);
    // if you will log info here most probably it might log default value so check in your render method for the latest value
     }
      })
      .catch((error) => {
        console.log(error);
      });
  }, []);

 

Убедитесь, что gid совпадает с вашим идентификатором группы. Для уверенности вы можете просто передать статический номер просто для проверки.
Теперь попробуйте получить доступ к информации в вашем методе визуализации, например:

 return 
<div>
{JSON.stringify(info)}
</div>


 

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

1. Это работает, но я получаю эту ошибку на своей консоли: Предупреждение: Не удается выполнить обновление состояния реакции для размонтированного компонента. Это не операция, но это указывает на утечку памяти в вашем приложении.

2. @Aishwariya Поскольку вы вызываете отключение асинхронной функции, вы должны прервать эту функцию в методе очистки useEffect. Вы можете проверить различные опции, которые можно выполнить для прерывания запроса на выборку, такие как AbortController в React и т. Д. Для этого вы можете задать другой вопрос или проверить решения. Пожалуйста, отметьте это как ответ, если ваша задача выполнена, это поможет другим найти полезные ответы . Спасибо