我有这样的对象数组:
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:子子类别>子类别>第一类。
我可能应该为此使用递归函数,但我不能为此考虑逻辑..有什么建议吗?
答案 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字段。
编辑:这是否具有吸引力当然可能取决于它是否足够快,以及您需要优化的功能。