0

我正在嘗試爲我的應用程序編寫一個簡單的模板管理器。這個想法是,所有的模板將被列在一個多維的對象/數組中,然後每個模板都將被某個函數解析。下面是我的模板對象的樣子:遞歸迭代地處理對象並將父母追加到每個孩子

var tpls = { 
    home: 'home', 
    about: 'about', 
    shop: { 
     basket: 'basket', 
     checkout: { 
      paypal: 'paypal', 
      sagepay: 'sagepay', 
     } 
    }, 
    user: { 
     profile: 'profile', 
     settings: 'settings', 
    } 
}; 

這裏是我到目前爲止已經編寫的功能:

function listTemplates(o, parent, templates) { 
    var templates = templates || []; 

    _.each(o, function (v, k, l) { 
     if (Object.keys(v).length > 0 && typeof v === 'object') { 
      listTemplates(v, k, templates); 
     } else if (typeof v === 'string') { 
      var n = (typeof parent === 'string') ? parent + '/' + k : k; 
      templates.push(n); 
     } 
    }); 

    return templates; 
}; 

它我要它做什麼,但是我在努力弄清楚如何我可以追加嵌套父名到最終輸出,以達到以下數組:

["home", "about", "shop/basket", "shop/checkout/paypal", "shop/checkout/sagepay", "user/profile", "user/settings"] 

目前,該功能輸出嵌套模板沒有他們的頂級的父母,像這樣:

["home", "about", "shop/basket", "checkout/paypal", "checkout/sagepay", "user/profile", "user/settings"] 

任何幫助將不勝感激。

回答

1

你忘了,如果條件通過父在你第一次:

if(Object.keys(v).length > 0 && typeof v === 'object') { 
    var n = (typeof parent === 'string') ? parent + '/' + k : k; 
    listTemplates(v, n, templates); 
} 

小提琴:http://jsfiddle.net/vt0oL8d5/輸出:

["home", "about", "shop/basket", "shop/checkout/paypal", "shop/checkout/sagepay", "user/profile", "user/settings"] 
+0

神聖的鱷梨醬!這工作。你介意多解釋一下爲什麼我也應該在第一種情況下通過它?似乎我一直在努力與遞歸... – goodpixels

+0

'父'擁有絕對路徑的孩子。在你的代碼中,你只是發送當前的父母,這將是'結賬'爲'paypal',而不發送結帳的父母,這將是'商店'。因此,當您在結帳時循環播放孩子時,父母需要「購物/結帳」,而不僅僅是「結帳」。 –

+0

對,我明白了。謝謝Seb! – goodpixels

相關問題