Javascript 如何使类似“object.object.variable”的字符串调用与字符串名完全相同的变量?

Javascript 如何使类似“object.object.variable”的字符串调用与字符串名完全相同的变量?,javascript,Javascript,我想创建一个JS预处理器,它只是用来显示JS变量中的数据,我目前得到: var ____Code = fs.readFileSync(__resources + '/help.txt').toString(); ____Code.split('{%').forEach((i,ii) => { var _Code = i.split('%}')[0]; ____Code.split('{%' + _Code + '%}').join(`${_Code}`);

我想创建一个JS预处理器,它只是用来显示JS变量中的数据,我目前得到:

var ____Code = fs.readFileSync(__resources + '/help.txt').toString();
    ____Code.split('{%').forEach((i,ii) => {
      var _Code = i.split('%}')[0];
      ____Code.split('{%' + _Code + '%}').join(`${_Code}`);
    });
这段代码的要点基本上是如果我有一个js文件,看起来像这样:

var obj = {
  hello: 'world',
  language: 'javascript',
  filetype: 'text',
  test: {
    successfull: 'Yes!'
  }
}
var ____Code = fs.readFileSync(__resources + '/help.txt').toString();
    ____Code.split('{%').forEach((i,ii) => {
      var _Code = i.split('%}')[0];
      ____Code.split('{%' + _Code + '%}').join(`${_Code}`);
    });
Is this successfull? {%obj.test.successfull%}
I am a {%obj.filetype%} file, that is has been read by {%obj.language%}.
The default example for {%obj.language%} is: "Hello {%obj.hello%}"
help.txt如下所示:

var obj = {
  hello: 'world',
  language: 'javascript',
  filetype: 'text',
  test: {
    successfull: 'Yes!'
  }
}
var ____Code = fs.readFileSync(__resources + '/help.txt').toString();
    ____Code.split('{%').forEach((i,ii) => {
      var _Code = i.split('%}')[0];
      ____Code.split('{%' + _Code + '%}').join(`${_Code}`);
    });
Is this successfull? {%obj.test.successfull%}
I am a {%obj.filetype%} file, that is has been read by {%obj.language%}.
The default example for {%obj.language%} is: "Hello {%obj.hello%}"
那么我希望输出是:

Is this successfull? Yes!
I am a text file, that is has been read by javascript.
The default example for javascript is: "Hello world"
但实际结果与help.txt完全相同,如何将{%variable%}替换为实际的js变量?

尝试以下方法:

变量a=` 成功了吗?{%obj.test.successfull%} 我是一个{%obj.filetype%}文件,它已被{%obj.language%}读取。 {%obj.language%}的默认示例是:Hello{%obj.Hello%} `; var obj={ 您好:'世界', 语言:“javascript”, 文件类型:“文本”, 测试:{ 成功:“是的!” } } var ___;代码=a; VarB=_____;u代码。拆分“{%”。forEachi,ii=>{ ifii==0 回来 var_Code=i.split“%}”[0]; 变量文本; eval`_text=${u Code}`; console.log_文本; console.log_代码 ____代码=uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu; };
console.log\u\u Code您应该使用Stringreplace和Arrayreduce的组合,而不是eval,后者通常性能较差,而且总是不太安全

风险值数据={ obj:{ 您好:'世界', 语言:“javascript”, 文件类型:“文本”, 测试:{ 成功:“是的!” } } } var\uuuuu Code=//fs.readFileSync\uuuu resources+'/help.txt'.toString ` 成功了吗?{%obj.test.successful%} 我是一个{%obj.filetype%}文件,它已被{%obj.language%}读取。 {%obj.language%}的默认示例是:Hello{%obj.Hello%} ` var result=\uuuuu代码。替换/\{%.*.%\}/g,函数,路径{ 返回路径。拆分“.”。reduceFunction o,k{ 返回o[k] },数据 }
console.LogResultm我可以建议一种不同的方法吗?使用正则表达式和其他非正则表达式对代码进行预处理是很困难的,而且不需要重新发明轮子。您可以使用现有的工具创建抽象语法树AST,用于预处理器?你需要以某种方式使用作业,并且可能希望避免使用foreachThank!这正是我想要的答案!当OP向其写入一些登录信息或使用obj[a]样式获取值时,它很容易崩溃。@blackmiaool Anything比eval更好;如果填塞物是OP提供的,而他/她并不关心性能,那该怎么办?然后我建议你写一份大量的免责声明,解释推荐你回答的情况。eval有它的用途,但在生产代码中这些用途很少。最快的tamplate引擎使用新函数来获取值。