【问题标题】:JS - Recursion - Loop through object graph return found object and save pathsJS - 递归 - 遍历对象图返回找到的对象并保存路径
【发布时间】:2017-09-20 17:04:01
【问题描述】:

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

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.) 第一个比较简单:我想搜索一个属性名(对象的值),不返回真(找到)或假,而是返回对象,我在其中找到了这个值。 (假设只有一个具有确切名称的实例)。

2.) 在最后一级对象(例如“obj element #1”及其属性“name”、“comment”和“etc.”)我想调用另一个方法并通过作为参数的完整路径:在此示例中,路径之一是:

主题 -> 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;
}

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

【问题讨论】:

  • 不能(合理地)搜索 JSON。相反,解析它,然后搜索生成的对象图。 JSON 是一种用于数据交换的文本符号(More here.) 如果您正在处理 JavaScript 源代码,而不是处理 string,那么您就不是在处理 JSON。
  • 查看this question's answers 并尝试将它们应用于您的问题。如果您在进行更多研究后卡在某个特定点上,searching SO thoroughly 等,请发布一个问题,其中包含您需要在 JavaScript 语法中搜索的结构的有效示例、您解决问题的尝试以及对你被困在哪里了。
  • 对不起我的错误!我的意思是一组嵌套对象。不知道 JSON 一词是错误的。到目前为止,我还添加了我的代码
  • 添加代码****

标签: javascript arrays object recursion nested


【解决方案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);
                }
            }
        }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多