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

Javascript 从最后一个对象层级移动到第一个对象层级,javascript,arrays,object,structure,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

我有这样的对象数组:

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-名称、u-id、s-子类别(内部类别),其中也包含n、u和s

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

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


我可能应该使用递归函数来实现这一点,但我想不出有什么逻辑。。有什么建议吗?

我认为解决这个问题最简单的方法是将列表重新构造成一个基于id的映射,该映射既包含有父id成员的对象,也包含没有父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字段进行筛选

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

例如:

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})
在JavaScript中找不到属性的父级或持有者(除非在属性值本身的某个地方跟踪它)。
[
 "Sub sub category 2",
 "Sub category",
 "3rd category"
]