首页 > 解决方案 > 在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 的值,而不是该地址的函数。

任何帮助,将不胜感激。谢谢!

标签: javascriptfunctionobjectnestedjavascript-objects

解决方案


没有直接的方法可以做到这一点。相反,您必须实现您的功能才能这样做。

这是一个或多或少简单的方法,使用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

推荐阅读