Я пытаюсь написать простой менеджер шаблонов для своего приложения. Идея состоит в том, что все шаблоны будут перечислены в многомерном объекте/массиве, а затем каждая из них будет анализироваться некоторой функцией. Вот что мой объект шаблон выглядит следующим образом:Итерация рекурсивно на объект и добавление родителей к каждому ребенку
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"]
Любая помощь будет принята с благодарностью.
святого гуакамол! это работает. вы не возражаете, объясняя немного больше ПОЧЕМУ я должен передать это в первом условии тоже? кажется, я всегда боролся с рекурсией ... – goodpixels
«parent» имеет абсолютный путь к ребенку. В вашем коде вы отправляете только текущий родитель, который будет 'checkout' для' paypal' без отправки родительского элемента checkout, который будет 'shop'. Поэтому, когда вы перебираете детей в кассе, родитель должен быть 'shop/checkout', а не только' checkout'. –
правый, я вижу. спасибо Seb! – goodpixels