переменная не может быть достигнута внутри цикла foreach - PullRequest
0 голосов
/ 24 октября 2019

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

var findclass = (data, day, time) => {
      var match;
      data.forEach(entry => {
        if (entry.day === day && entry.time === time) {
          console.log("found");
          match=entry;//this statement has no effect on above var match
//instead it creates a new local variable
        }
      });
      return match;
    }



exports.tt = functions.https.onRequest((request, response) => {
  let qr = request.body.queryResult;
  let day = qr.parameters.day;
  let time = parseInt(qr.parameters.time.substring(11, 13));
  let data = [
    {
      day: "monday",
      time: 11,
      type: "lecture",
      batches: ["A", "B1", "B4", "B3", "B2"],
      subject: {
        name: "Basic Numerical Methods",
        name_short: "BNM",
        coursecode: "17B1NMA531",
        coursecode_short: "17MA531"
      },
      class: "CS1",
      teachers: "SSH",
      semester: 5
    },
    {
      day: "monday",
      time: 15,
      type: "lecture",
      batches: ["A6", "A9"],
      subject: {
        name: "Environmental Science",
        name_short: "EVS",
        coursecode: "15B11GE301",
        coursecode_short: "GE301"
      },
      class: "CS1",
      teachers: "EKT",
      semester: 5
    }]
var match = findclass(data, day, time);
  console.log(JSON.stringify(match));
  if (match) {
    response.send({
      fulfillmentText: `Yes, ${match.subject.name_short || match.subject.name}`
    });
  } else {
    response.send({
      fulfillmentText: `No class on ${day} ,${time} hr`
    });
  }

также код vscode показывает, что сопоставление переменных не используется, если яудалить оператор сопоставления с возвратом, это означает, что он не рассматривает match = entry, но я не могу понять почему?

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

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

Кроме того, в VSCode, если вы просто присваиваете переменную, но не используете ее (например, в операторе return), она покажетпеременная как неиспользуемая, так что ожидается.

0 голосов
/ 25 октября 2019

Я не знаю причину, но два изменения исправили код

1) Добавление "use strict" вверху.
2) определение функции как

const findclass = () => {}

вместо var

0 голосов
/ 24 октября 2019

Я предполагаю, что ваше объявление:

var match ...

поднимается ... см .:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

В вашем коде вы объявили:

var match ...

дважды. Я думаю, что объявление в теле функции findClass может быть изменено на локальную переменную ...

let match;

(Это предположение, удалит этот ответ по запросу или, если придет лучший ответ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...