从最后一个对象级别移动到第一个对象级别

时间:2014-02-06 12:42:41

标签: javascript arrays object structure

我有这样的对象数组:

var Categories = [
    {n:'1st category',u:1,s:[{n:'Sub category',u:2,s:[{n:'Sub sub category',u:3,s:[]},{n:'Sub sub category 2',u:4,s:[]},{n:'Sub sub category 3',u:5,s:[]}]},{n:'Sub category',u:6,s:[{n:'Sub sub category',u:7,s:[]},{n:'Sub sub category 2',u:8,s:[]},{n:'Sub sub category 3',u:9,s:[]}]},{n:'Sub category',u:10,s:[{n:'Sub sub category',u:11,s:[]},{n:'Sub sub category 2',u:12,s:[]},{n:'Sub sub category 3',u:13,s:[]}]}]},
    {n:'2nd category',u:14,s:[{n:'Sub category',u:15,s:[{n:'Sub sub category',u:16,s:[]},{n:'Sub sub category 2',u:17,s:[]},{n:'Sub sub category 3',u:18,s:[]}]}]},
    {n:'3rd category',u:19,s:[{n:'Sub category',u:20,s:[{n:'Sub sub category',u:21,s:[]},{n:'Sub sub category 2',u:22,s:[]},{n:'Sub sub category 3',u:23,s:[]}]}]}
];

图例: n - name,u - id,s - 子类别(固有类别),其中还包含n,u和s。

因此,子类别的深度始终在变化,并且不是固定的。是否可以执行查找所有母/父类别名称的函数?

喜欢,如果我要搜索id 2(u = 2),它会找到我u1,所以直到Sub类别的方式是:第1类>子类别,如果我要查找u = 6:子子类别>子类别>第一类。

我可能应该为此使用递归函数,但我不能为此考虑逻辑..有什么建议吗?

2 个答案:

答案 0 :(得分:1)

例如:

findCat = function(u, obj) {
    if(obj.u == u)
        return [];
    for(var i = 0; i < obj.s.length; i++) {
        var p = findCat(u, obj.s[i]);
        if(p)
            return p.concat([obj.s[i].n])
    }
    return null;
}

path = findCat(22, {s:Categories})

结果:

[
 "Sub sub category 2",
 "Sub category",
 "3rd category"
]

答案 1 :(得分:0)

我认为解决此问题的最简单方法是将列表重组为基于id的映射,该映射包含具有parent-id成员和没有对象的对象(因此这些是超级类别)。

您的地图将类似于:

{
    1: {n: '1st Category'}
    2: {n: 'Sub category', parent-id: 1}
    3: {n: 'Sub sub category', parent-id: 2}
    14: {n: '2nd Category'}
}

这将使查找某些类别的路由变得微不足道,并且获取顶级类别列表只会过滤对象是否具有父ID字段。

编辑:这是否具有吸引力当然可能取决于它是否足够快,以及您需要优化的功能。