#javascript #arrays
#javascript #массивы
Вопрос:
Когда я пытаюсь выполнить итерацию по массиву, получить его длину или получить доступ к индексам, я получаю сообщение об ошибке TypeError: Cannot read property 'map' of undefined
.
Массив не пуст, и когда я console.log()
его получил.
0: {user_id: 11, …}
length: 1
__proto__: Array(0)
Я вижу, что proto: Array(0) и я предполагаю, что это означает, что это массив длиной 0, но как мне сделать его ненулевой длиной, чтобы я мог перебирать его?
Код для справки:
useEffect(() => {
blog.authors.map(data => {
console.log(data)
})
}, [blog])
Я тоже пробовал. Это сработало, но я сразу же получил аналогичную ошибку.
useEffect(() => {
(async() => {
await blog.authors.map(data => {
console.log(data)
})
})()
}, [blog])
Комментарии:
1.
.map()
возвращает новый массив; чего вы ожидаете?2.
__proto__: Array(0)
означает, что объект, наследуемый отArray.prototype
которого, является пустым массивом. Это ничего не говорит о длине самого объекта, который есть1
.3.
.map()
это просто пример. Это не работает как индексация в этом массиве или что-то еще.Unhandled Rejection (TypeError): Cannot read property '0' of undefined
.4. Ошибка «не удается прочитать свойство ‘map’ из undefined » означает, что
blog.authors
это само по себеundefined
. Возможно, он все еще загружается или что-то в этом роде? Обратите внимание, что ваш эффект может вызываться несколько раз. Вероятноif (blog.authors) blog.authors.forEach(console.log)
, должно быть достаточно.5. Берги знает, о чем он говорит, попробуйте его код, это поможет вам понять
Ответ №1:
Простая проверка, если blog.authors
не определено, решила проблему.
Ответ №2:
Нет, индексы массива 0 based
равны .
var arr = ['a', 'b'];
console.log(arr.length); // => 2
console.log(arr[0]); // => a
Поэтому вместо того, чтобы делать сбивающие с толку утверждения о том, что работает, а не без предоставления кода, в котором они предоставляют другой код, не могли бы вы просто увидеть результат этого:
useEffect(() => {
console.log({blog});
console.log({authors: blog.authors });
blog.authors.map(data => {
console.log(data)
})
}, [blog])
Потому что я подозреваю, что blog
это изменилось со временем, из-за того, что некоторые авторы и что-то авторы не определены.
Комментарии:
1. У вас есть два отдельных
useEffect
, один из которых извлекает данные и устанавливает их в состояние, а другой — консоль. выход из состояния. И нет начального значения вuseState
? Верно? Если вы предоставите полный код, мы можем дать вам полный ответ, простоif
это исправление ошибки, а не реальное решение.2. Реальный ответ — проверить, не определен ли blog.authors . Я должен был проверить это раньше, но пропустил. Blog.authors находится в состоянии redux.