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