2017-12-27 805 views
-2

我有一個我一直在使用和工作的代碼片段。它在我的應用程序中使用很多,我需要加快速度。以字符串路徑深入訪問對象是否有更好的方法?它需要能夠訪問的屬性和方法,請參閱我下面的例子:訪問在javascript中使用字符串路徑的深層屬性和方法

 function get(obj, path) { 
     var paths = path.split('.'), 
     curProp = obj; 
     for(var i=0;i<paths.length;i++){ 
      if (!curProp[paths[i]]) return 
      curProp = (typeof curProp[paths[i]] !== "function") ? curProp[paths[i]] : curProp[paths[i]]() ; 
     } 
     return curProp; 
    } 

的片段通過該對象的路徑將繼承屬性傳遞

var obj = {contact:{name:"john"}}; 
console.log(get("contact.name",obj)); 

如果對象有一個返回的方法反對它可以返回太

var obj = {contact:function(){return {name:"john"}}}; 
console.log(get("contact.name",obj)); 
+2

如果這是**工作代碼**,你認爲可以改進,參見[codereview.se。否則,請澄清具體問題。 – jonrsharpe

+0

感謝您的提示! – MartinWebb

+1

這與函數式編程有什麼關係?你爲什麼要爲函數*值*做一個例外? – naomik

回答

1

你的問題的本質 - 即,訪問深性編程 - 顯示你正在接近函數式編程與自己的IDE至於它應該如何工作。

功能風格的程序不會以這種方式使用對象。即使我們可以用功能性風格(下面)來表達程序,無論使用get函數的程序的任何部分都應該重構,而不是使用動態對象和動態對象查找。

同樣,使用方法來存儲對象的值也來自面向對象的風格。一旦你停止思考OO風格的事情,你就會開始看到功能風格的獨特優勢。

const recur = (...values) => 
 
    ({ tag: recur, values }) 
 

 
const loop = (f) => 
 
    { 
 
    let acc = f() 
 
    while (acc && acc.tag === recur) 
 
     acc = f (...acc.values) 
 
    return acc 
 
    } 
 

 
const get = (obj = {}, path = []) => 
 
    loop ((o = obj, [p, ...ps] = path.split ('.')) => 
 
    (p === undefined) 
 
     ? o 
 
     : o[p] === undefined 
 
     ? undefined 
 
     : recur (o[p], ps)) 
 

 
const data = 
 
    { a: { b: { c: 1, d: null } } } 
 

 
console.log (get (data, 'a'))  // { b: { c: 1 } } 
 
console.log (get (data, 'a.b')) // { c: 1 } 
 
console.log (get (data, 'a.b.c')) // 1 
 
console.log (get (data, 'a.b.c.')) // undefined 
 
console.log (get (data, 'd'))  // undefined 
 
console.log (get (data, 'a.b.d')) // null

+0

在你的測試中你不會返回一個方法,在我的代碼中它返回屬性和方法,{a:1,b:function(){return {c:1}}} – MartinWebb

+0

爲什麼要用功能風格,你會不會帶着你的oo風格習慣?你的問題沒有意義:( – naomik

+0

對不起,如果我的問題沒有意義,我想要做的就是討論是否可以優化我的代碼以返回顯示的結果? – MartinWebb