【发布时间】:2017-09-08 06:57:10
【问题描述】:
在 javascript 代码中,我有一个定义对象内属性路径的字符串。比如
var def = "contact.email"
如何从这个字符串中得到下面的函数?
o => o.contact.email
以便我可以通过以下方式使用它:
var person = {
name: 'Test',
contact: { email: 'test@test.test' }
}
var emailGetter = MagicCompileFunction('contact.email');
var email = emailGetter(person);
// here, email should hold the value of person.contact.email
编译时路径字符串未知。它也可以由用户提供。
该解决方案也应该适用于非浏览器环境(没有window 对象),例如在NodeJS 服务器端javascript 中。
我知道一种解决方案是创建一个将对象和字符串作为参数的通用方法(例如valueGetter(person, "contact.email")),其中字符串定义对象内的路径,然后在每个点上拆分字符串'。并按照对象上的路径。但我不希望这个算法在每次调用getter 函数时都执行。我需要一个动态编译的方法,它会给我一个最终的 getter,可以立即访问所需的(子)属性。
【问题讨论】:
-
为什么你需要一个最终的吸气剂?解决方案(如果您完全按照指定需要)将使用
eval,这在大多数情况下都是一个糟糕的主意,包括这个。通用方法将是更好的解决方案。 -
我会尝试一种“通用”方法,看看它的性能如何,然后再尝试编写一些科学项目。
-
事实上我什至不认为你问什么有意义,除非你想直接“编译”成运行时中间代码,这肯定是“科学项目”。一旦知道了属性名称,仍然需要从链中的每个对象中按顺序获取属性值。
-
@Pointy 这是一个可能会被执行数百或数千次的方法。我认为包含字符串拆分和 for 循环的通用方法来循环路径中的每个属性将比字典查找效率低。另一方面,使用泛型方法可以更轻松地避免访问未定义对象的属性,但这会在循环中添加额外的 if 检查。
-
如果确实如此,那么也许您应该重新考虑构建数据结构的方式。我的意思是,如果有重要的性能考虑,那么探索系统的其他方面可能会改变可能会很好。
标签: javascript node.js ecmascript-6 code-generation dynamic-code