Цикл «for» делает мои данные == неопределенными

#node.js #request

Вопрос:

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

  • Первая консоль.журнал: карточка: { тип: ‘викторина’, заголовок: ‘Угадай, кто’, описание: ‘Начало семестровой викторины, чтобы узнать, насколько хорошо класс знает друг друга’, слаг: ‘угадай, кто’, обложка: ‘https://media.kahoot.it/e6740327-876d-4610-9fba-bc305f4bcae0_opt ‘, coverMetadata: [Объект], draftExists: false, number_of_questions: 38, создатель: ‘bfdca93b-efba-4ccb-a64d-c5538b24ba94’, creator_username: ‘s_swan’, creatorPrimaryUsageType: ‘SCHOOL’, creator_avatar: {}, значки: [], видимость: 1, заблокировано: false, Защита от записи: false, featured: false, молодый_прекрасный: false, спонсируемый: false, черновик: false, комбинированный: false, compatibility_level: 6, sample_questions: [Array], number_of_plays: 110, number_of_players: 274, total_favourites: 0, question_types: [Array], создан: 1471873436135, изменен: 1474121015925, доступ: [Object], duplication_disabled: false, uuid: ‘b58c19b5-b098-4531-a1c6-e8e735e8f7b2’ }
  • Вторая консоль.log(): не определено

В цикле «for» данные будут неопределенными, каким образом?

У меня есть этот код:

 var options = {
    'method': 'GET',
    'url': 'https://create.kahoot.it/rest/kahoots/?query=' nam 'amp;cursor=0amp;limit=20amp;topicsamp;grades=amp;orderBy=relevanceamp;searchCluster=1amp;includeExtendedCounters=False',
    'headers': {
      'Authorization': 'Bearer ' token
    }
};

// Starting the request
request(options, function (error, response, body) {
    if (error) throw new Error(error);
        
    var data = JSON.parse(body);
    var quizzes = data['entities'];
    console.log(quizzes);
    // Going the all the quzzies we found
    for(quiz in quizzes)  {
        card = quiz['card'];
        console.log(card);
    }
});```
 

Ответ №1:

Проблема № 1

Основываясь на вашем первом console.log, похоже, что ваша quizzes переменная является объектом … а не массивом, поэтому вы не перебираете массив тестов…вы выполняете итерацию по объекту…сначала убедитесь, что ваша quizzes переменная является массивом.

Проблема № 2

Когда вы используете for...in оператор, quiz переменная будет возвращать имя каждого свойства в объекте.

Так что, если я просто консоль.запишите переменную quiz, например:

 for(quiz in quizzes)  {
  console.log(card);
}
 

Я бы увидел все свойства, зарегистрированные в консоли, следующим образом:

 type
title
description
slug
.....
 

Решение: используйте for...of оператор

Когда вы используете for...of оператор, переменная, которую вы устанавливаете ( quiz в вашем случае), является целым объектом.

Так что, если я просто консоль.запишите переменную quiz, например:

 for(const quiz of quizzes)  {
  console.log(quiz);
}
 

Я бы увидел это:

 card: {
      type: 'quiz',
      title: 'Viet Nam War',
      description: 'Viet Nam War',
      slug: 'viet-nam-war',
      draftExists: false,
      number_of_questions: 37,
      creator: '01f63a9f-737b-4f59-b7f5-af10b78ce904',
      creator_username: 'Mr.TBrown',
      creatorPrimaryUsageType: 'SCHOOL',
      creator_avatar: {},
      badges: [],
      visibility: 1,
      locked: false,
      writeProtection: false,
      last_edit: [Object],
      featured: false,
      young_featured: false,
      sponsored: false,
      moderation: [Object],
      draft: false,
      combined: false,
      compatibility_level: 6,
      sample_questions: [Array],
      number_of_plays: 65,
      number_of_players: 169,
      total_favourites: 0,
      question_types: [Array],
      created: 1527781306997,
      modified: 1528072275324,
      access: [Object],
      duplication_disabled: false,
      uuid: 'cea8c609-ee88-4f11-b146-e8c70f302f14'
    }
 

Дополнительные примеры см. В следующих документах MDN:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…in

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…of

Комментарии:

1. Спасибо @GabrielMC но по какой-то причине это ничего не меняет, это ничего не изменило

2. Извините, я сейчас переписываю свой ответ

3. К, взгляни сейчас. Я попытался лучше объяснить, зачем вам нужно for...of

Ответ №2:

Если вы хотите выполнить цикл над массивом, который вы обычно хотите использовать for...of вместо for...in , а также вам нужно добавить объявление переменной (const или let).

 for(const quiz of quizzes)  {
    card = quiz['card'];
    console.log(card);
}
 

Комментарии:

1. Спасибо @mmoehrlein, это сработало