метод синтаксического анализа и возвращает результат

#javascript

#javascript

Вопрос:

У меня есть этот сценарий, в котором у меня есть функция, которая оценивает строки. Проблема, с которой я сталкиваюсь, заключается в том, что это не работает с методами.

JSON.stringify() не удается преобразовать методы в строку, поэтому я использую эту функцию замены здесь.

К сожалению, функция представляет собой строку, когда я пытаюсь ее выполнить.

 let obj = {
   name: "Max",
   test() {
      return "cool";
   }
}


function parseString(str, obj) {
  let variables = Object.keys(obj).join(",");
  let strData = JSON.stringify(obj, function(key, value) {
    if (typeof value === "function") {
      return value.toString();
    } else {
      return value;
    }
  });
  return new Function(`let {${variables}} = ${strData}; return ${str}; `).call(
    obj
  );
}

console.log(parseString("name", obj)); //expected output: "max"
console.log(parseString("test()", obj)); //expected output: "cool"  

Есть ли способ выполнить функцию и вернуть результат? Какой-нибудь обходной путь?

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

1. JSON предназначен для чистых данных. Это независимый от языка формат сериализации, нет смысла помещать в него код.

Ответ №1:

 let obj = {
   name: "Max",
   test() {
      return "cool";
   }
}


function parseString(str, obj) {
  let variables = Object.keys(obj).join(",");
  let strData = JSON.stringify(obj, function(key, value) {
    if (typeof value === "function") {
      return value();
    } else {
      return value;
    }
  });
  return new Function(`let {${variables}} = ${strData}; return ${str}; `).call(
    obj
  );
}

console.log(parseString("name", obj)); //expected output: "max"
console.log(parseString("test", obj)); //expected output: "cool"  

Ответ №2:

 let obj = {
   name: "Max",
   test() {

      return "cool";
   }
}


function parseString(str, obj) {
  let variables = Object.keys(obj).join(",");
  let strData = JSON.stringify(obj, function(key, value) {
    if (typeof value === "function") {
      return value.toString();
    } else {
      return value;
    }
  });
  return new Function(`let {${variables}} = ${strData}; return ${str}; `).call(
    obj
  );
}

console.log(parseString("name", obj)); //expected output: "max"
console.log(parseString("obj.test()", obj)); //expected output: "cool"  

Ответ №3:

Вы были очень близки. Вы только что допустили две небольшие ошибки. просто используйте test вместо test() при вызове функции в консоли. и другой — пока типом значения является функция, вам нужно вызывать это значение как функцию, как value().toString() вместо value.toString() . Остальная часть кода идеальна.

 let obj = {
   name: "Max",
   test() {
      return "cool";
   }
}


function parseString(str, obj) {
  let variables = Object.keys(obj).join(",");
  let strData = JSON.stringify(obj, function(key, value) {
    if (typeof value === "function") {
      return value().toString(); // change value to value()
    } else {
      return value;
    }
  });
  return new Function(`let {${variables}} = ${strData}; return ${str}; `).call(
    obj
  ); 
}

console.log(parseString("name", obj)); //expected output: "max"
console.log(parseString("test", obj)); // Change test() to test