JS - 递归 - 循环对象图返回找到的对象并保存路径

时间:2017-09-20 17:04:02

标签: javascript arrays object recursion nested

我有一个具有以下结构的对象图:

topic
- obj #1
- obj #2
--- attr #2 name
--- attr #2 elements
------obj element #1
---------attr element #1 name
---------attr element #1 comment
---------attr element #1 etc.
------obj element #2
--- attr #2 etc.
- obj #3

它由对象和对象数组组成。我需要获取每个元素,但图表的未知数量级别。所以,为了遍历所有元素,需要一个递归循环(我猜?)。

现在我有两个不同的任务:

1。)首先是更简单的一个:我想搜索属性名称(对象的值)而不是返回true(找到)或false,但返回对象,其中我发现了这个价值。 (假设只有一个具有确切名称的实例)。

2。)在最后一级对象(例如' obj元素#1'及其属性' name',' comment&#39和'等等我希望调用另一个方法并将参数作为参数传递给那里的完整路径:在这个例子中,其中一条路径是:

主题 - > obj#2 - > obj元素#1。 下一个(下一个函数调用):

主题 - > obj#2 - > obj元素#2。

因此需要一个数组来存储'路径'在递归。该阵列也需要改变,例如,当转到下一个元素时,有必要删除路径的最后一个元素并添加新元素(#2)。同样,从递归回来时。

这是我尝试过的(显然不对,也许有些回报是无用的/太多)。关于1):

function findIdentifier (obj, identifier){
    var el=null;
    if(typeof obj === 'object'){
        if (!Array.isArray(obj)){
            for(var key in obj){
                if (obj.hasOwnProperty(key)) {
                    if (key.indexOf(identifier) !== -1 || obj[key] === identifier){
                        //found right object
                        el = obj[key];
                        return el;
                    }
                    else el = findIdentifier(obj[Object.keys(obj)[0]],identifier);
                }
            }
            return el;
        }
        else{
            for(var i=0; i<obj.length; i++){
                if (obj[i].indexOf(identifier) !== -1 && obj.length>1){
                    el = obj[i];
                    return el;
                }
                else el = findIdentifier(obj[0],identifier);
            }
            return el;
        }
    }
    return el;
}

我希望你们明白我的意思。我很感激每一个答案!

1 个答案:

答案 0 :(得分:1)

我解决了第一部分:

function findIdent (obj, identifierKey){
var res=null;
    for (var i in obj) {
        if (!!obj[i] && typeof(obj[i])==="object") {
            console.log(i+"    "+identifierKey);
            if(i.indexOf(identifierKey) !== -1 || i === identifierKey){
                return obj[i];  
            }
            else res=findIdent(obj[i], identifierKey);
        }
    }
    return res;
}

这就是我所需要的。也许你发现了一些不必要的部分?递归时,我不是最好的。

让我感到傍晚,但现在我也解决了我的第二个问题。我会写我的解决方案,以防其他人遇到类似的问题:

function getPaths(obj, level, singlePathArray, allPaths)

这就是收集所有路径的诀窍。 obj是对象图,level限制循环遍历图的级别数,singlePathArray收集单个路径的信息,allPaths存储所有已完成的单个路径。

这里重要(我先错过了)是区分对象:

if (!!obj && typeof(obj)==="object") {
        if(!Array.isArray(obj)){
        //push a object with path info in singlePathArray
        //if desired level reached -> push singlePathArray into allPaths
        //else call recursive function (obj: obj.elementsArray)
        }else{
            for (var i in obj) {
                if (!!obj[i] && typeof(obj[i]) === "object") {
                    allPaths=getPaths(obj[i], level, singlePathArray,allPaths);
                    singlePathArray.splice(-1,1);
                }
            }
        }

}