簡體   English   中英

在javascript中替換深度嵌套在對象中的函數

[英]Replacing a function deeply nested inside an object in 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()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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM