Javascript Не удается прочитать второй элемент массива, который является массивом

Я пытаюсь получить доступ ко всем элементам моего массива, кроме первого, но получаю пустые значения.

renderTableBody = thisService => {
  console.info(thisService); // in the image it's the printed array
  console.info(thisService.length); // in the image is the number 1

  return thisService.slice(1).map(item =>
    item.map(k => (
      <TableRow key = {k.kpiId}>
        <TableCell align = "left" component = "th" scope = "row">
          {k.kpiId}
        </TableCell>
        <TableCell align = "left">{k.kpiName}</TableCell>
        <TableCell align = "left">{k.targetDisplay}</TableCell>
        <TableCell align = "left">{k.targetDisplay}</TableCell>
        <TableCell align = "left">{k.reason}</TableCell>
        <TableCell align = "left">{k.action}</TableCell>
        <TableCell align = "left">{k.dueDate}</TableCell>
        <TableCell align = "left">{k.owner}</TableCell>
      </TableRow>
    ))
  );
};

Когда я регистрирую длину массива, он печатает 1, когда на самом деле имеет 2 элемента. Когда я пытаюсь получить доступ только ко второму элементу массива, я получаю «неопределенное».

Это зарегистрированный объект консоли: Javascript Не удается прочитать второй элемент массива, который является массивом

Я делаю что-то неправильно при доступе ко второму элементу моего массива, который сам является массивом?

РЕДАКТИРОВАТЬ Часть кода, где я вызываю функцию renderTableBody:

<div id = "servicesInputs">
    {kpiServInputs.map((service) => (
        <div key = {service[0].id} id = {service[0].id}>
            <div align = "left">
                <h4>{service[0].serviceName}</h4>
            </div>
            <div>
                <Paper >
                    <Table>
                        <TableHead>
                            <TableRow>
                                <TableCell align = "left">#</TableCell>
                                <TableCell align = "left">KPI</TableCell>
                                <TableCell align = "left">Target</TableCell>
                                <TableCell align = "left">Actual</TableCell>
                                <TableCell align = "left">Reason</TableCell>
                                <TableCell align = "left">Action</TableCell>
                                <TableCell align = "left">Due Date</TableCell>
                                <TableCell align = "left">Owner</TableCell>
                            </TableRow>
                        </TableHead>
                        <TableBody>
                            {this.renderTableBody(service)}
                        </TableBody>
                    </Table>
                </Paper>
            <br/>
            </div>
        </div>
        ))}
</div>

Вы только пытаетесь распечатать значения из массива, найденного в thisService[1]?

adr5240 08.07.2019 21:00

Я предполагаю, что массив заполняется асинхронно?

Emile Bergeron 08.07.2019 21:00

Используйте console.info(JSON.stringify(thisService)). Если вы наведете курсор на этот значок i в синем поле, вы обнаружите, что он показывает самое последнее значение переменной, а не значение на момент ее регистрации.

Heretic Monkey 08.07.2019 21:01

Что показывает значок «i» рядом с массивом console.info? почти уверен, что есть разница между массивом виртуальной DOM React и загруженной в фактическую DOM

pmiranda 08.07.2019 21:03

@pmiranda говорит: «Значение ниже было оценено только что»

esmehsnj 08.07.2019 21:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
403
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

renderTableBody = thisService => {
  console.info(thisService); // in the image it's the printed array
  console.info(thisService.length); // in the image is the number 1

  return thisService[1].map(item =>
    item.map(k => (
      <TableRow key = {k.kpiId}>
        <TableCell align = "left" component = "th" scope = "row">
          {k.kpiId}
        </TableCell>
        <TableCell align = "left">{k.kpiName}</TableCell>
        <TableCell align = "left">{k.targetDisplay}</TableCell>
        <TableCell align = "left">{k.targetDisplay}</TableCell>
        <TableCell align = "left">{k.reason}</TableCell>
        <TableCell align = "left">{k.action}</TableCell>
        <TableCell align = "left">{k.dueDate}</TableCell>
        <TableCell align = "left">{k.owner}</TableCell>
      </TableRow>
    ))
  );
};

Это должен быть ваш код, потому что, как указал @Dupocas, thisService — это массив, который выглядит как [{Object}, [Array]].

Когда вы запускаете slice для этого и map для результата, вы пытаетесь отобразить внешний массив чего-то вроде [['stuff you need']]. Этот внешний массив имеет длину 1 и будет действовать точно так же, как вы его видите. Изменив slice для прямого доступа к первому индексу thisService, вы будете циклически просматривать необходимую информацию.

Я получаю сообщение «Uncaught TypeError: невозможно прочитать карту свойств неопределенного». Он не распознает второй элемент внешнего массива

esmehsnj 08.07.2019 22:27

Только что заметил, что у вас есть 3 журнала консоли в образе. Что такое первое: (5) [Array]... и второе: [{...}], так как в вашем коде всего 2 console.info

adr5240 08.07.2019 22:31

массив thisService является элементом другого массива, который вы видите зарегистрированным (5) [Array]

esmehsnj 08.07.2019 22:34

так thisService == [{...}]? Или спросите немного лучше: thisService — это массив с одним JS-объектом внутри?

adr5240 08.07.2019 22:36

Это объект, который вы видите на картинке, которую я увеличил. Он имеет один объект json и другой массив элементов.

esmehsnj 08.07.2019 22:37
thisService.slice(1) для массива длины 1 вернет пустой массив.
adr5240 08.07.2019 22:39

Давайте продолжить обсуждение в чате.

esmehsnj 08.07.2019 22:41
Ответ принят как подходящий

Проблема заключалась в том, что массив заполнялся асинхронно с выполнением fetch вызова api. Что сработало для меня, так это сделать возврат асинхронным и дождаться завершения вызова fetch, а затем заполнить массив.

Код:

function fetchKpiServicesInputs(state) {
    let serviceInputs = [];
    return async dispatch => {

    for (var i = 0; i < servicesCount; i++) {
        let newServ = [];
        newServ.push({id: i, serviceName: kpiServices[i].name });

        let url = "apiUrl";
        const response = await fetch(url, {
            method: 'GET'
        });
        const responseData = await response.json();
        if (Object.keys(responseData).length > 0) {
            newServ.push(responseData);
        }
        serviceInputs.push(newServ);
    }
    dispatch(receiveKpiServiceInputs(serviceInputs));
};

Спасибо всем за помощь!

Другие вопросы по теме