React Native L oop Json Response - PullRequest
       16

React Native L oop Json Response

0 голосов
/ 27 марта 2020

У меня есть json данные вроде этого, но я получил ошибку, как это исправить? мой код: я хочу показать данные внутри "узлов", но сначала я хочу проверить это в console.log, но я получил ошибку

constructor(props){
        super(props);
        this.state = {
            kasus_baru: {},
            isError : false,
            isLoading : true,
        };

    }

axios.get('xxxxxx')
    .then(res=>{
        const data_kasus = res.data;

        this.setState({kasus_baru : data_kasus });
        //console.log(this.state.kasus_baru)
        this.state.kasus_baru.nodes.map((obj,i) => {
            console.log(obj[i].kasus);
        }); 
    })

вот ответы:

{
"data": {
    "nodes": [{
            "id": 1,
            "kasus": 1,
            "klaster": "DKI JAKARTA",
        },
        {
            "id": 2,
            "kasus": 2,
            "klaster": "DKI JAKARTA",
        }
    ]
}

}

почему я получил эту ошибку?

[Отклонение необработанного обещания: TypeError: undefined не является объектом (оценка '_this2.state.kasus_baru.nodes.map')]

Ответы [ 4 ]

0 голосов
/ 28 марта 2020

Я решил эту проблему, ответ - я должен добавить .data после получения ответа

.then(res=>{
        const data_kasus = res.data.data;
})

данные ответа:

{
"data": {
    "nodes": [{
            "id": 1,
            "kasus": 1,
            "klaster": "DKI JAKARTA",
        },
        {
            "id": 2,
            "kasus": 2,
            "klaster": "DKI JAKARTA",
        }
    ]
}

, поскольку в ответе json были данные ключ.

спасибо за всех вас, кто помогает мне

0 голосов
/ 27 марта 2020

Покажите мне код, где вы пытаетесь получить доступ к объектам. Как говорится в этом ответе, вы пытаетесь получить доступ к объекту, ключ которого не существует в текущем объекте. Например, вы пытаетесь получить доступ к ключу типа

data.nodes.id, который вызовет исключение. вам нужно получить к нему доступ data.nodes [index] .id

0 голосов
/ 27 марта 2020

Проблема в том, что ваш kasus_baru ключ в состоянии не имеет значения с именем nodes

. Вы должны понимать, как работает setState. Он асинхронный, поэтому ответ не устанавливается напрямую в состояние. Вы должны дождаться обновления состояния и затем использовать обновленное состояние. setState принимает обратный вызов в качестве второго аргумента, который выполняется после установки состояния. Так что сделайте это как

this.setState({
kasus_baru : data_kasus
 },()=>{
        this.state.kasus_baru.nodes.map((obj,i) => {
            console.log(obj[i].kasus);
        }); 
    })
});

Пожалуйста, обратитесь к этой статье для подробного объяснения

0 голосов
/ 27 марта 2020

Причина, по которой вы получаете ошибку, заключается в том, что объект, на который вы пытаетесь отобразить, не определен.

this.state. kasus_baru . node.map ((obj, i) => {console.log (obj [i] .kasus);});

Я настоятельно рекомендую вам отладить ваш код и убедиться, что ваш ответ JSON действителен и что при доступе к свойствам объектов вы проверяете, что они существуют.

То есть проверьте, что .nodes является фактическим свойством kasus_baru.

Вы можете сделать это с помощью

kasus_baru.hasOwnProperty("nodes")

Кроме того, если у вас есть объект из вашего ответа, зачем обращаться к нему? Сквозное состояние?

ОБНОВЛЕНИЕ (из-за комментариев ОП)

Ваша проблема не в l oop, итерирующем по узлам , но, скорее, видя, что данные, которые вы получаете по вашему запросу, действительны.

Чтобы сделать это, я бы сделал следующее:

axios.get('xxxxxx')
.then(res=>{
    const data_kasus = res.data;
    if (data_kasus.hasOwnProperty('nodes')) {
      var nodes = data_kasus['nodes'];
      for(let index = 0; index < nodes.length; index++) {
           var node = nodes[index];
           //Do your logic here...
      } //end for
    } // end if
})
...