相对路径列表 - 根据路径对它们进行分组

时间:2013-01-21 14:46:31

标签: javascript backbone.js

我有几条路径,它可以是无限的深度和路径数量。

我使用骨干,并从服务器获取数据,每个模型包含一个路径字段,例如:

"/home/harry/"
"/home/sally/"
"/home/sally/personal"
"/home/harry/files"
"/home/harry/photos"
"/home/harry/videos"
"/home/harry/files/documents"
"/home/harry/files/personal"
"/home/harry/photos/2012"
"/home/harry/photos/2011"
"/home/harry//videos/2012"
"/home/harry/videos/edited"
"/home/harry/videos/edited/other/trash_this"

我想对模型进行分组,以便我可以在我的Web应用程序中表示文件结构,以便您可以单击“home”并列出其所有相关目录,依此类推。因此,您可以进一步单击该结构,直到该文件夹​​/目录中没有其他文件或目录。

1 个答案:

答案 0 :(得分:0)

一种解决方案就是将这些路径解析为一组集合。类似的东西:

var home = new PathCollection({});
_(models).each(function(model) {
    if (model.get('path').indexOf('/home/') == 0) {
        model.set('relativePath', model.get('path').substr(6)) ; ditch '/home/'
        home.add(model);
    }
}

然后,在PathCollection中你可以覆盖add方法来做类似的事情(即查看模型的相对路径的第一部分并将它们添加到相应的Collection中),如下所示:

var PathCollection = Backbone.Collection.extend({
    add: function(model) {
        // NOTE: This is naive; a real add would need to accept multiple models
        if (model.get('relativePath').indexOf('harry/') == 0) {
             // create harry collection if it doesn't exist
             if (!this.harry) this.harry = new PathCollection();
             this.harry.add(model);
        } 
    }
})

当然,您可能希望将其设置为更通用,并拆分“/”字符,而不是对特定路径执行特定的indexOf检查,但希望您能够理解。关键是,如果你编写一个集合来检查其成员模型的路径,并在适当的时候将它们添加到其他集合中,那么在一天结束时你将得到一个很好的嵌套系列集合。

一旦你有了这个,检查哪些模型属于哪些路径变得微不足道;例如,你可以在/ home / harry / path下获取模型:

home.harry.models;