将此绑定到 JSON.parse()

诺姆德洛

我有我需要通过结合解析字符串转换成JS对象的情况下,这个象下面这样:

var jsString = '{"name" : this.name, "age": this.age}';
this.name = "Hello";
this.age = 100;

//This fails(CASE 1)
var jsObjectFromString = JSON.parse(jsString);
console.log(jsObjectFromString );

//This works(CASE 2)
var directObject = {"name" : this.name, "age": this.age};
console.log(directObject);


//Need below output for console.log(jsObjectFromString ):
//{"name" : "Hello", "age": 100}

在我的实际程序中,字符串来自网络服务,因此我不能使用 CASE 2 方法。

我可以在解析后遍历 JS 对象并设置参数,如下所示:

var jsonString = '{"name" : "", "age": 0}';
var jsonObject = JSON.parse(jsonString);
jsonObject["name"] = this.name;
jsonObject["age"] = this.age;

但是有很多内部对象和遍历将是一种杀戮。我尝试了以下但失败了(显然:():

JSON.parse(jsonString).bind(this);

有没有办法克服这个问题?

PS:这是一个基于浏览器的应用程序,而不是一个节点项目。

编辑:我想从字符串构造一个 javascript 对象。我想将字符串的一部分(如名称、年龄)替换为解析的 Javascript 对象中的实际值。

短柄

这是一个非常奇怪的用例,我确信您的应用程序的设计应该改变。但这里是基于允许的属性白名单和“this”特定角色的协议的解决方案。初始字符串中的子字符串:

let income = '{"name" : this.name, "age": this.age}';
this.name = "Hello";
this.age = 100;

const whiteList = ['name', 'age'];
const inject = (prop) => {
  if(typeof this[prop] === 'string') {
    return '"' + this[prop] + '"';
  }
  return this[prop];
};

whiteList.forEach(prop => income = income.replace('this.' + prop, inject(prop)));

console.log(income); // {"name" : "Hello", "age": 100}

您可以通过以下方式升级程序

  • 自动从上下文中获取白名单
  • 通过附加符号保护解析器 ': this.'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章