Как получить значение из массива объектов?

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

С этим:

console.log(this.props.users)

введите здесь описание изображения Я получаю список со всеми объектами внутри него. Но когда мне нужно получить доступ к определенному объекту или свойству этого объекта, например:

console.log(this.props.users[0])
console.log(this.props.users[0].name)

Я получаю сообщение об ошибке:

Cannot read property '0' of undefined

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


person bobby    schedule 31.01.2019    source источник
comment
пожалуйста, опубликуйте вывод консоли для первого состояния консоли   -  person Ravi Theja    schedule 31.01.2019
comment
Как выглядит ваш массив объектов?   -  person Bodrov    schedule 31.01.2019
comment
не могли бы вы показать нам структуру объектов пользователей?   -  person G.aziz    schedule 31.01.2019
comment
Что показывает console.log(this.props.users)?   -  person jrswgtr    schedule 31.01.2019
comment
Вы либо неправильно подключаете свой компонент к хранилищу, либо, если props.users загружается асинхронно, возможно, вы пытаетесь получить доступ к записи в массиве, который еще не загружен. Выложите код компонента.   -  person Max    schedule 31.01.2019
comment
@Max, но я могу получить доступ ко всем данным, я просто не могу получить конкретный объект или свойство, посмотрите журнал моей консоли   -  person bobby    schedule 31.01.2019
comment
@bobby Вы вызываете console.log в методе рендеринга? Пользователи загружаются асинхронно?   -  person Max    schedule 31.01.2019
comment
@Max, да, я вызываю его в методе рендеринга, и они загружаются асинхронно.   -  person bobby    schedule 31.01.2019
comment
@Бобби. Можете ли вы поделиться тем, как пользователи передаются в реквизиты для этого компонента. Получаете ли вы пользователей из избыточного состояния или передаете их через компонент более высокого порядка?   -  person Cool Guy    schedule 31.01.2019


Ответы (2)


Возможно, когда вы выполняете эту строку this.props.users, она не определена. Проверьте поток, в который вы добавили console.log(this.props.users[0])

person Ajinkya    schedule 31.01.2019
comment
но в то же время я могу перечислить в консоли весь массив с помощью console.log(this.props.users) - person bobby; 31.01.2019
comment
@bobby Вы можете получить доступ к this.props.users.length? - person Bergi; 31.01.2019
comment
@Берги нет, я не могу - person bobby; 31.01.2019
comment
@bobby Можешь console.log(JSON.stringify(this.props.users))? Я предполагаю, что ваш консольный журнал на самом деле не из строки, которую вы думали, что она пришла - person Bergi; 31.01.2019
comment
@bergi Я сделал это, и я получил результат в консоли ... у Макса есть правильный ответ - person bobby; 31.01.2019

Вы пытаетесь получить доступ к свойствам this.props.users до того, как он загрузится. Ваш компонент отображается, не дожидаясь получения ваших данных. Когда вы console.log(this.props.users) говорите, что получаете массив, но, кроме того, он, вероятно, регистрирует undefined по крайней мере один раз, когда компонент рендерится до того, как this.props.users загрузится.

У вас есть несколько вариантов. Вы можете сделать это либо в самом верху вашего метода рендеринга, чтобы предотвратить выполнение остального кода в методе:

if (!this.props.users) return null;

После получения данных и изменения реквизита метод рендеринга будет вызван снова.

Другой вариант - объявить значение по умолчанию для пустого массива для users в вашем редюсере.

person Max    schedule 31.01.2019
comment
у меня есть пустой массив в редукторе, и с ним он тоже не работал, но с первым вариантом, который вы сказали, он работает - person bobby; 31.01.2019
comment
@bobby Если это так, вы, вероятно, где-то перезаписываете значение по умолчанию для пользователей, прежде чем они будут получены. - person Max; 31.01.2019
comment
как объявить значение по умолчанию для массива объектов? если я просто поставлю arrayofObjects = [], в первый раз, когда приложение отображает arrayOfObjects.object.someProperty, оно выдаст ошибку, что не может прочитать свойство undefined - person bobby; 01.02.2019
comment
Трудно определить глубоко вложенные значения по умолчанию. В этом случае _.get из lodash — хорошее решение. _.get(arrayOfObjects, 'object.someProperty', 'banana') вернет значение по умолчанию (третий аргумент) вместо того, чтобы выдавать ошибку. lodash.com/docs/4.17.11#get - person Max; 01.02.2019