【问题标题】:Replacing a function deeply nested inside an object in javascript在javascript中替换深层嵌套在对象中的函数
【发布时间】:2020-04-07 04:16:05
【问题描述】:

我有一个对象,其中包含可能嵌套很深的函数(可能比这更多,所以我需要一个可以在任何深度工作的解决方案):

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 处理参数,因此我可以访问指定地址的函数,如下所示:

keypath = x["b"]["c"]["d"]

但如果我尝试使用 newFunc 替换该位置的函数,它只会替换 keypath 的值,而不是该地址的函数。

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

【问题讨论】:

    标签: javascript function object nested javascript-objects


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 2021-12-20
      • 2018-05-21
      • 2019-04-08
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2020-04-01
      相关资源
      最近更新 更多