5

看看下面的片段。有没有我可以编写的函数来代替...生成路由,可以在另一个函数中重用?可能是什么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);
                        }
                    }
                }
            }
        }
    }
}
4

2 回答 2

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这将在包含该对象路径的每个对象中放置一个新属性。

http://jsfiddle.net/alnitak/WbMfW/

于 2012-04-27T17:24:03.170 回答
1

您不能像Alnitak所说的那样进行递归搜索,但是可以进行自上而下的搜索,尽管根据对象的大小可能会有些慢。您将遍历对象的属性,检查它是否有子对象。如果它确实有一个孩子,循环遍历它,等等。当你到达链的末端并且你还没有找到你的函数时,移动到下一个孩子并继续搜索。

现在没有时间写一个例子,但希望你能从中拼凑出一些东西。

于 2012-04-27T17:26:36.357 回答