Почему я получаю сообщение «Невозможно прочитать свойство неопределенной ошибки», когда я могу распечатать неопределенную переменную? - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь написать рекурсивную функцию, которая читает строку с вложенными круглыми скобками и превращает ее в массив с вложенными массивами. Например: (hello(hi)are(yo(u))) => ["hello",["hihow"],"are"["yo",["u"]]]

(вы можете спросить, почему я помещаю один элемент в массив. Я планирую разделить строки разделителями #, но я сделаю что после того, как я смогу хотя бы вложить отдельные строки)

Мой код на данный момент:

 const preProcessString = element => {
    var elementComponents = [];
    var part = "";
    var rS;
    if (
      element.indexOf("(") < element.indexOf(")") &&
      element.indexOf("(") !== -1
    ) {
      part = element.slice(0, element.indexOf("("));
      elementComponents.push(part);
      rS = preProcessString(element.substr(element.indexOf("(") + 1));
      console.log(rS[0]);//Am able to print the exact value that is causing the error
      elementComponents.push(rS[0]);//Causing the "cannot read property of undefined error"
      element = rS[1];
    } else {
      part = element.slice(0, element.indexOf(")"));
      elementComponents.push(part);
      return [elementComponents, element.substr(element.indexOf(")") + 1)];
    }
};
console.log(preProcessString("(hello(hi)are(yo(u)))"));

Я получаю эту ошибку:

 ParseStepFile.js:272 Uncaught TypeError: Cannot read property '0' of undefined
    at preProcessString (ParseStepFile.js:272)

Но я могу распечатать значение (и это ожидаемое значение) " undefined »в операторе console.log прямо перед строкой, вызывающей ошибку. Как это возможно? Что я могу сделать, чтобы это исправить? Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Действительный вывод, который вы получаете, - это когда вы вызываете здесь preProcessString.

rS = preProcessString(element.substr(element.indexOf("(") + 1));

Ошибка возникает после этого, и этот rS действительно не определен, потому что вы ничего не возвращаете

 const preProcessString = element => {
    var elementComponents = [];
    var part = "";
    var rS;
    if (
      element.indexOf("(") < element.indexOf(")") &&
      element.indexOf("(") !== -1
    ) {
      part = element.slice(0, element.indexOf("("));
      elementComponents.push(part);
      rS = preProcessString(element.substr(element.indexOf("(") + 1));
      console.log(rS[0]);//Am able to print the exact value that is causing the error
      elementComponents.push(rS[0]);//Causing the "cannot read property of undefined error"
      element = rS[1];
      console.log("As you can see, enters here and return nothing to your rS so the rS is undefined")
    } else {
      part = element.slice(0, element.indexOf(")"));
      elementComponents.push(part);
      return [elementComponents, element.substr(element.indexOf(")") + 1)];
    }
};
console.log(preProcessString("(hello(hi)are(yo(u)))"));
0 голосов
/ 30 мая 2020

Ваш вывод не соответствует словам в вашем вводе. Я предполагаю, что это ошибка.


const input = `(hello(hi)are(yo(u)))`

console.log(
  JSON.parse(
    input.replace(/\(/g, `", ["`)
         .replace(/\)/g, `"], "`)
         .replace(/^", /, ``)
         .replace(/, "$/, ``)
         .replace(/, ""/g, ``)
  )
);
...