в то время как оценка состояния цикла не работает должным образом - PullRequest
0 голосов
/ 10 февраля 2019

Обычно я ожидал бы, что условие цикла while будет иметь значение true, и код внутри будет запущен:

while ([" ", ":", ",", ""].includes("")) {
        cursor = getCh();
      }

Если вы скопируете приведенный ниже фрагмент в devtools, вы увидите это в строке 18тот же сценарий, который я описал выше, оценивается как ложный, и код внутри не запускается.Я пытаюсь выяснить, почему.Опять же, если вы поместите точку останова в строку 18 и войдете в функцию nextValue, вы увидите, что курсор установлен в пустую строку, а затем проверяется условный цикл while.Вместо оценки true и входа в цикл он оценивается как false, как я обрисовал выше. Остальная часть функции parseJSON не является частью вопроса, на который я пытаюсь ответить, я просто хочу знать, почему цикл while внутри вспомогательной функции nextValue не вводится, когда переменная курсора равна пустойstring. Необходимо было вставить весь код, так как это единственный раз, когда я столкнулся с проблемой.

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

var parseJSON = function(json) {


  json = json.split("")
  var cursor = json[0];

  function parser() {


    var grammar = {


      'object': {
        'build': function() {
          var obj = {};

          while (cursor != "}") {
            nextValue([" ", ":", ",", '']);
            if (cursor === undefined || cursor === "}") {
              cursor = getCh();
              return obj;
            }
            var property = parser(json);
            nextValue([":", " "]);
            obj[property] = parser(json);
          }

          cursor = getCh();
          return obj;
        },
        'identifier': ["{", ":", "}"]
      }

    };

    // Resets json variable and returns the first character
    function getCh() {
      json = json.slice(1);
      return json[0];
    }

    // Resets cursor until cursor does not equal argument
    function nextValue(char) {
      // run getCh() while not a value
      cursor = getCh();
      while (char.includes(cursor)) {
        cursor = getCh();
      }
    }

    // Searches through type identifiers in our grammar to determine 
    // whichfunction to run
    for (var key in grammar) {
      if (grammar[key].identifier.includes(cursor)) {
        return grammar[key].build();
      }
    }
  };

  return parser(json);
};
var input = '{\r\n' +
  '          "glossary": {\n' +
  '              "title": "example glossary",\n\r' +
  '      \t\t"GlossDiv": {\r\n' +
  '                  "title": "S",\r\n' +
  '      \t\t\t"GlossList": {\r\n' +
  '                      "GlossEntry": {\r\n' +
  '                          "ID": "SGML",\r\n' +
  '      \t\t\t\t\t"SortAs": "SGML",\r\n' +
  '      \t\t\t\t\t"GlossTerm": "Standard Generalized ' +
  'Markup Language",\r\n' +
  '      \t\t\t\t\t"Acronym": "SGML",\r\n' +
  '      \t\t\t\t\t"Abbrev": "ISO 8879:1986",\r\n' +
  '      \t\t\t\t\t"GlossDef": {\r\n' +
  '                              "para": "A meta-markup language,' +
  ' used to create markup languages such as DocBook.",\r\n' +
  '      \t\t\t\t\t\t"GlossSeeAlso": ["GML", "XML"]\r\n' +
  '                          },\r\n' +
  '      \t\t\t\t\t"GlossSee": "markup"\r\n' +
  '                      }\r\n' +
  '                  }\r\n' +
  '              }\r\n' +
  '          }\r\n' +
  '      }\r\n'
console.log(parseJSON(input));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...