看看下面的代码段。是否有任何函数可以替换...
来生成路由,可以在另一个函数中重用?或许像var route = this.show.fullyQualifiedName
这样的东西?
var services = {
'github.com': {
api: {
v2: {
json: {
repos: {
show: function(username, fn) {
var route = ...;
// route now == 'github.com/api/v2/json/repos/show'
route += '/' + username;
return $.getJSON('http://' + route).done(fn);
}
}
}
}
}
}
}
答案 0 :(得分:3)
不,没有,至少没有使用“反射”式操作。
对象不知道包含它们的对象的名称,尤其是因为同一个对象(引用)可以包含在许多对象中。
你能做到的唯一方法就是从顶层对象开始,然后按照你的方式工作,例如:
function fillRoutes(obj) {
var route = obj._route || '';
for (var key in obj) {
if (key === '_route') continue;
var next = obj[key];
next._route = route + '/' + key;
fillRoutes(next);
}
}
将在包含该对象路径的每个对象中放置一个新的_route
属性。
答案 1 :(得分:1)
你不能像 Alnitak 那样进行递归搜索,但你可以做一个自上而下的搜索,虽然根据对象的大小,它可能会有些慢。你循环遍历对象的属性,检查它是否有子对象。如果它确实有一个孩子,那么循环,等等。当你到达一个链的末尾并且你没有找到你的功能时,移动到下一个孩子并继续搜索。
现在没有时间写一个例子,但希望你可以从中拼凑一些东西。