#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