Длина массива равна нулю, но массив не пуст

#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.