javascript - 在javascript中替换深层嵌套在对象中的函数
问题描述
我有一个包含可能嵌套很深的函数的对象(可能比这更多的级别,所以我需要一个可以在任何深度工作的解决方案):
x = {
a: function() { console.log ("original function 1") },
b: {
c: {
d: function() { console.log ("original function 2") }
}
}
}
我希望能够将函数的键路径作为参数传递给另一个函数,并用新函数替换原始函数:
g = function( functionAddress ) {
functionAddress = function() { console.log( "replacement function" )}
}
这样执行后:
g("x.b.c.d");
x.b.c.d() // replacement function
g("x.a");
x(a) // replacement function
我已经能够使用 split、shift 和 reduce 处理参数,因此我可以访问指定地址的函数,如下所示:
键路径 = x["b"]["c"]["d"]
但是如果我尝试使用 newFunc 替换该位置的函数,它只会替换 keypath 的值,而不是该地址的函数。
任何帮助,将不胜感激。谢谢!
解决方案
没有直接的方法可以做到这一点。相反,您必须实现您的功能才能这样做。
这是一个或多或少简单的方法,使用Array#split()
and Array#reduce()
:
const x = {
a: function() { console.log ("original function 1") },
b: {
c: {
d: function() { console.log ("original function 2") }
}
}
}
const setDeep = (object, path, value)=>{
const pathArray=path.split('.')
pathArray.slice(0,-1).reduce(Reflect.get,object)[pathArray[pathArray.length-1]]=value
}
setDeep(x, 'b.c.d', function(){console.log('replacement function')});
x.b.c.d() //replacement function
推荐阅读
- rxjs - 如何在 rxjs 中执行“onErrorContinue”
- google-cloud-platform - GCP 本地云构建挂起
- r - 在闪亮中创建虚拟键盘
- custom-renderer - Xamarin.Forms:当显示 ToolbarItems 时,如何在 TitleView 中居中显示图像?
- python - 如何将缺失点绘制成一个完整的圆圈?
- list - 从列表中的字典中提取值
- acumatica - 无法从自定义项目浏览器屏幕发布自定义
- r - 在 R 中设置符号对象的子集
- django - 使用 smtp.domain.com 的 Django send_mail 错误(smtplib.SMTPHeloError: (501, b'Syntactically invalid HELO argument(s)'))
- angular - 如何使用 observable 显示没有数据源的角度列表中找不到数据