我正试图为我的应用程序写一个简单的模板管理器。这个想法是,所有模板将在一个多维对象/数组中列出,然后每个模板将被一些函数解析。下面是我的模板对象的样子:
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"]
您忘记在第一个if条件中传递父元素:
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"]