首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript菜单递归函数错误

Javascript菜单递归函数错误
EN

Stack Overflow用户
提问于 2017-05-19 10:09:28
回答 2查看 58关注 0票数 0

//当前操纵http://jsfiddle.net/0ht35rpb/45/

我试图遍历一个json导航树,这样当一个人进入一个特定的页面时,它就会找到它的替代语言反部分。

//JSON

代码语言:javascript
复制
{
    "langs" : [
        {
            "lang"  : "de",
            "lines" : {
                "menu"    : [
                    {
                        "title"    : "Anleitung",
                        "link"     : "/de/anleitung"
                    },
                    {
                        "title"    : "Funktionen",
                        "link"     : "/de/funktionen"
                    },
                    {
                        "title"    : "Dienstleistungen",
                        "link"     : "/de/dienstleistungen",
                        "children" : [
                            {
                                "title" : "Geistiges Eigentum",
                                "link"  : "/de/dienstleistungen/geistiges-eigentum"
                            },
                            {
                                "title" : "Compliance",
                                "link"  : "/de/dienstleistungen/compliance"
                            },
                            {
                                "title" : "Investment- und Beteiligungsrecht",
                                "link"  : "/de/dienstleistungen/beteiligungsrecht"
                            },
                            {
                                "title" : "Mergers & Acquisitions",
                                "link"  : "/de/dienstleistungen/mergers-and-acquisitions"
                            },
                            {
                                "title" : "Immobilienrecht",
                                "link"  : "/de/dienstleistungen/immobilienrecht"
                            },
                            {
                                "title" : "Internet- und Datenschutzrecht",
                                "link"  : "/de/dienstleistungen/internetrecht"
                            },
                            {
                                "title" : "Gesellschaftsrecht",
                                "link"  : "/de/dienstleistungen/gesellschaftsrecht"
                            },
                            {
                                "title" : "Handelsrecht",
                                "link"  : "/de/dienstleistungen/handelsrecht"
                            },
                            {
                                "title" : "Arbeitsrecht",
                                "link"  : "/de/dienstleistungen/arbeitsrecht"
                            },
                            {
                                "title" : "Bankrecht",
                                "link"  : "/de/dienstleistungen/bankrecht"
                            },
                            {
                                "title" : "Vertragsrecht",
                                "link"  : "/de/dienstleistungen/vertragsrecht"
                            },
                            {
                                "title" : "Wettbewerbsrecht",
                                "link"  : "/de/dienstleistungen/wettbewerbsrecht"
                            }
                        ]
                    },
                    {
                        "title"    : "Beliebte Projekte",
                        "link"     : "/de/beliebte-projekte",
                        "children" : [
                            {
                                "title"     : "Compliance",
                                "link"      : "/de/beliebte-projekte/compliance",
                                "children" : [
                                    {
                                        "title"      : "Haftungsrisiken für Geschäftsführern",
                                        "link" : "/de/beliebte-projekte/compliance/haftungsrisken-geschaeftsfuehrern"
                                    },
                                    {
                                        "title"      : "Compliance-Prüfung KMU",
                                        "link" : "/de/beliebte-projekte/compliance/compliance-pruefung-kmu"
                                    }
                                ]
                            }
                        ]
                    }
                ],
                "sign_in" : "Login"
            }
        },
        {
            "lang"  : "en",
            "lines" : {
                "menu"    : [
                    {
                        "title"    : "How it works",
                        "link"     : "/en/how-it-works"
                    },
                    {
                        "title"    : "Features",
                        "link"     : "/en/features"
                    },
                    {
                        "title"    : "Services",
                        "link"     : "/en/services",
                        "children" : [
                            {
                                "title" : "Intellectual property",
                                "link"  : "/en/services/intellectual-property"
                            },
                            {
                                "title" : "Compliance",
                                "link"  : "/en/services/compliance"
                            },
                            {
                                "title" : "Investment law",
                                "link"  : "/en/services/investment-law"
                            },
                            {
                                "title" : "Mergers & Acquisitions",
                                "link"  : "/en/services/mergers-and-acquisitions"
                            },
                            {
                                "title" : "Real estate law",
                                "link"  : "/en/services/real-estate-law"
                            },
                            {
                                "title" : "Internet law and data privacy",
                                "link"  : "/en/services/internet-law"
                            },
                            {
                                "title" : "Company law",
                                "link"  : "/en/services/company-law"
                            },
                            {
                                "title" : "Trade law",
                                "link"  : "/en/services/trade-law"
                            },
                            {
                                "title" : "Labour law",
                                "link"  : "/en/services/labour-law"
                            },
                            {
                                "title" : "Bank law",
                                "link"  : "/en/services/bank-law"
                            },
                            {
                                "title" : "Contract law",
                                "link"  : "/en/services/contract-law"
                            },
                            {
                                "title" : "Competition law",
                                "link"  : "/en/services/competition-law"
                            }
                        ]
                    },
                    {
                        "title"    : "Popular Projects",
                        "link"     : "/en/popular-projects",
                        "children" : [
                            {
                                "title"     : "Compliance",
                                "link"      : "/en/popular-projects/compliance",
                                "children" : [
                                    {
                                        "title"      : "Haf eng",
                                        "link" : "/en/popular-projects/compliance/haf-eng"
                                    },
                                    {
                                        "title"      : "Compliance eng",
                                        "link" : "/en/popular-projects/compliance/compliance-eng"
                                    }
                                ]
                            }
                        ]
                    }
                ],
                "sign_in" : "Sign in"
            }
        }
    ]
}

我的js功能

所以在这种情况下

设想CURRENTLNG为en CURRENTURL as /en/services

在"/en/popular-projects/compliance/compliance-eng","/de/beliebte-projekte/compliance/compliance-pruefung-kmu“()中,我希望返回一个数组,其中包含"/en/services”、"/de/dienstleistungen“,这段代码在尝试获取第三级导航计数器部件fetchFooterUrls时失败了。

代码语言:javascript
复制
  getUrl (pairUrl, currentLng, enMenu, deMenu, obj) {
    for (let k in obj) {
      if (!obj.hasOwnProperty(k)) continue
      if (obj[k].link === pairUrl) {
        if (currentLng === 'de') {
          return enMenu[k].link // get en link equivlant
        } else {
          return deMenu[k].link // get de link equivlant
        }
      } else {
        if (obj[k].hasOwnProperty('children') && obj[k].children.length > 0) continue
        this.getUrl(pairUrl, currentLng, enMenu[k].children, deMenu[k].children, obj[k].children)
      }
    }
  }
  //
  getLanguagePair (currentLng, pairUrl) {
    //  'find url in json tree'
    var enMenu = linkTreeObject.langs[1].lines.menu
    var deMenu = linkTreeObject.langs[0].lines.menu

    let obj = {}
    // find position in tree
    if (currentLng === 'de') {
      obj = deMenu
    } else {
      obj = enMenu
    }

    return this.getUrl(pairUrl, currentLng, enMenu, deMenu, obj)
  }

  fetchFooterUrls () {
    let deUrl = ''
    let enUrl = ''

    if (CURRENTLNG === 'de') {
      deUrl = CURRENTURL
      enUrl = this.getLanguagePair(CURRENTLNG, this.props.location.pathname)
    } else {
      enUrl = CURRENTURL
      deUrl = this.getLanguagePair(CURRENTLNG, this.props.location.pathname)
    }
    return [enUrl, deUrl]
  }

//试图让这个片段-有主持人在这里解决吗?

代码语言:javascript
复制
    var linkTreeObject ={
    "langs" : [
        {
            "lang"  : "de",
            "lines" : {
                "menu"    : [
                    {
                        "title"    : "Anleitung",
                        "link"     : "/de/anleitung"
                    },
                    {
                        "title"    : "Funktionen",
                        "link"     : "/de/funktionen"
                    },
                    {
                        "title"    : "Dienstleistungen",
                        "link"     : "/de/dienstleistungen",
                        "children" : [
                            {
                                "title" : "Geistiges Eigentum",
                                "link"  : "/de/dienstleistungen/geistiges-eigentum"
                            },
                            {
                                "title" : "Compliance",
                                "link"  : "/de/dienstleistungen/compliance"
                            },
                            {
                                "title" : "Investment- und Beteiligungsrecht",
                                "link"  : "/de/dienstleistungen/beteiligungsrecht"
                            },
                            {
                                "title" : "Mergers & Acquisitions",
                                "link"  : "/de/dienstleistungen/mergers-and-acquisitions"
                            },
                            {
                                "title" : "Immobilienrecht",
                                "link"  : "/de/dienstleistungen/immobilienrecht"
                            },
                            {
                                "title" : "Internet- und Datenschutzrecht",
                                "link"  : "/de/dienstleistungen/internetrecht"
                            },
                            {
                                "title" : "Gesellschaftsrecht",
                                "link"  : "/de/dienstleistungen/gesellschaftsrecht"
                            },
                            {
                                "title" : "Handelsrecht",
                                "link"  : "/de/dienstleistungen/handelsrecht"
                            },
                            {
                                "title" : "Arbeitsrecht",
                                "link"  : "/de/dienstleistungen/arbeitsrecht"
                            },
                            {
                                "title" : "Bankrecht",
                                "link"  : "/de/dienstleistungen/bankrecht"
                            },
                            {
                                "title" : "Vertragsrecht",
                                "link"  : "/de/dienstleistungen/vertragsrecht"
                            },
                            {
                                "title" : "Wettbewerbsrecht",
                                "link"  : "/de/dienstleistungen/wettbewerbsrecht"
                            }
                        ]
                    },
                    {
                        "title"    : "Beliebte Projekte",
                        "link"     : "/de/beliebte-projekte",
                        "children" : [
                            {
                                "title"     : "Compliance",
                                "link"      : "/de/beliebte-projekte/compliance",
                                "children" : [
                                    {
                                        "title"      : "Haftungsrisiken für Geschäftsführern",
                                        "link" : "/de/beliebte-projekte/compliance/haftungsrisken-geschaeftsfuehrern"
                                    },
                                    {
                                        "title"      : "Compliance-Prüfung KMU",
                                        "link" : "/de/beliebte-projekte/compliance/compliance-pruefung-kmu"
                                    }
                                ]
                            }
                        ]
                    }
                ],
                "sign_in" : "Login"
            }
        },
        {
            "lang"  : "en",
            "lines" : {
                "menu"    : [
                    {
                        "title"    : "How it works",
                        "link"     : "/en/how-it-works"
                    },
                    {
                        "title"    : "Features",
                        "link"     : "/en/features"
                    },
                    {
                        "title"    : "Services",
                        "link"     : "/en/services",
                        "children" : [
                            {
                                "title" : "Intellectual property",
                                "link"  : "/en/services/intellectual-property"
                            },
                            {
                                "title" : "Compliance",
                                "link"  : "/en/services/compliance"
                            },
                            {
                                "title" : "Investment law",
                                "link"  : "/en/services/investment-law"
                            },
                            {
                                "title" : "Mergers & Acquisitions",
                                "link"  : "/en/services/mergers-and-acquisitions"
                            },
                            {
                                "title" : "Real estate law",
                                "link"  : "/en/services/real-estate-law"
                            },
                            {
                                "title" : "Internet law and data privacy",
                                "link"  : "/en/services/internet-law"
                            },
                            {
                                "title" : "Company law",
                                "link"  : "/en/services/company-law"
                            },
                            {
                                "title" : "Trade law",
                                "link"  : "/en/services/trade-law"
                            },
                            {
                                "title" : "Labour law",
                                "link"  : "/en/services/labour-law"
                            },
                            {
                                "title" : "Bank law",
                                "link"  : "/en/services/bank-law"
                            },
                            {
                                "title" : "Contract law",
                                "link"  : "/en/services/contract-law"
                            },
                            {
                                "title" : "Competition law",
                                "link"  : "/en/services/competition-law"
                            }
                        ]
                    },
                    {
                        "title"    : "Popular Projects",
                        "link"     : "/en/popular-projects",
                        "children" : [
                            {
                                "title"     : "Compliance",
                                "link"      : "/en/popular-projects/compliance",
                                "children" : [
                                    {
                                        "title"      : "Haf eng",
                                        "link" : "/en/popular-projects/compliance/haf-eng"
                                    },
                                    {
                                        "title"      : "Compliance eng",
                                        "link" : "/en/popular-projects/compliance/compliance-eng"
                                    }
                                ]
                            }
                        ]
                    }
                ],
                "sign_in" : "Sign in"
            }
        }
    ]
};



  getUrl (pairUrl, currentLng, enMenu, deMenu, obj) {
    for (let k in obj) {
      if (!obj.hasOwnProperty(k)) continue
      if (obj[k].link === pairUrl) {
        if (currentLng === 'de') {
          return enMenu[k].link // get en link equivlant
        } else {
          return deMenu[k].link // get de link equivlant
        }
      } else {
        if (obj[k].hasOwnProperty('children') && obj[k].children.length > 0) continue
        this.getUrl(pairUrl, currentLng, enMenu[k].children, deMenu[k].children, obj[k].children)
      }
    }
  }
  //
  getLanguagePair (currentLng, pairUrl) {
    //  'find url in json tree'
    var enMenu = linkTreeObject.langs[1].lines.menu
    var deMenu = linkTreeObject.langs[0].lines.menu

    let obj = {}
    // find position in tree
    if (currentLng === 'de') {
      obj = deMenu
    } else {
      obj = enMenu
    }

    return this.getUrl(pairUrl, currentLng, enMenu, deMenu, obj)
  }

console.log(getLanguagePair("en", "/en/how-it-works"))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-19 11:01:14

更新了弹琴。其他部分中与递归函数调用相关的错误。http://jsfiddle.net/gaganshera/0ht35rpb/51/

改到

代码语言:javascript
复制
 if (!obj[k].hasOwnProperty('children') || obj[k].children.length <= 0) continue;
 var ret = getUrl(pairUrl, currentLng, enMenu[k].children, deMenu[k].children, obj[k].children);
 if(typeof ret != 'undefined') return ret;

代码语言:javascript
复制
var linkTreeObject = {
  "langs": [{
    "lang": "de",
    "lines": {
      "menu": [{
        "title": "Anleitung",
        "link": "/de/anleitung"
      }, {
        "title": "Funktionen",
        "link": "/de/funktionen"
      }, {
        "title": "Dienstleistungen",
        "link": "/de/dienstleistungen",
        "children": [{
          "title": "Geistiges Eigentum",
          "link": "/de/dienstleistungen/geistiges-eigentum"
        }, {
          "title": "Compliance",
          "link": "/de/dienstleistungen/compliance"
        }, {
          "title": "Investment- und Beteiligungsrecht",
          "link": "/de/dienstleistungen/beteiligungsrecht"
        }, {
          "title": "Mergers & Acquisitions",
          "link": "/de/dienstleistungen/mergers-and-acquisitions"
        }, {
          "title": "Immobilienrecht",
          "link": "/de/dienstleistungen/immobilienrecht"
        }, {
          "title": "Internet- und Datenschutzrecht",
          "link": "/de/dienstleistungen/internetrecht"
        }, {
          "title": "Gesellschaftsrecht",
          "link": "/de/dienstleistungen/gesellschaftsrecht"
        }, {
          "title": "Handelsrecht",
          "link": "/de/dienstleistungen/handelsrecht"
        }, {
          "title": "Arbeitsrecht",
          "link": "/de/dienstleistungen/arbeitsrecht"
        }, {
          "title": "Bankrecht",
          "link": "/de/dienstleistungen/bankrecht"
        }, {
          "title": "Vertragsrecht",
          "link": "/de/dienstleistungen/vertragsrecht"
        }, {
          "title": "Wettbewerbsrecht",
          "link": "/de/dienstleistungen/wettbewerbsrecht"
        }]
      }, {
        "title": "Beliebte Projekte",
        "link": "/de/beliebte-projekte",
        "children": [{
          "title": "Compliance",
          "link": "/de/beliebte-projekte/compliance",
          "children": [{
            "title": "Haftungsrisiken für Geschäftsführern",
            "link": "/de/beliebte-projekte/compliance/haftungsrisken-geschaeftsfuehrern"
          }, {
            "title": "Compliance-Prüfung KMU",
            "link": "/de/beliebte-projekte/compliance/compliance-pruefung-kmu"
          }]
        }]
      }],
      "sign_in": "Login"
    }
  }, {
    "lang": "en",
    "lines": {
      "menu": [{
        "title": "How it works",
        "link": "/en/how-it-works"
      }, {
        "title": "Features",
        "link": "/en/features"
      }, {
        "title": "Services",
        "link": "/en/services",
        "children": [{
          "title": "Intellectual property",
          "link": "/en/services/intellectual-property"
        }, {
          "title": "Compliance",
          "link": "/en/services/compliance"
        }, {
          "title": "Investment law",
          "link": "/en/services/investment-law"
        }, {
          "title": "Mergers & Acquisitions",
          "link": "/en/services/mergers-and-acquisitions"
        }, {
          "title": "Real estate law",
          "link": "/en/services/real-estate-law"
        }, {
          "title": "Internet law and data privacy",
          "link": "/en/services/internet-law"
        }, {
          "title": "Company law",
          "link": "/en/services/company-law"
        }, {
          "title": "Trade law",
          "link": "/en/services/trade-law"
        }, {
          "title": "Labour law",
          "link": "/en/services/labour-law"
        }, {
          "title": "Bank law",
          "link": "/en/services/bank-law"
        }, {
          "title": "Contract law",
          "link": "/en/services/contract-law"
        }, {
          "title": "Competition law",
          "link": "/en/services/competition-law"
        }]
      }, {
        "title": "Popular Projects",
        "link": "/en/popular-projects",
        "children": [{
          "title": "Compliance",
          "link": "/en/popular-projects/compliance",
          "children": [{
            "title": "Haf eng",
            "link": "/en/popular-projects/compliance/haf-eng"
          }, {
            "title": "Compliance eng",
            "link": "/en/popular-projects/compliance/compliance-eng"
          }]
        }]
      }],
      "sign_in": "Sign in"
    }
  }]
};

function getUrl(pairUrl, currentLng, enMenu, deMenu, obj) {
  for (let k in obj) {
    if (!obj.hasOwnProperty(k)) continue
    if (obj[k].link === pairUrl) {
      if (currentLng === 'de') {
        return enMenu[k].link // get en link equivlant
      } else {
        return deMenu[k].link // get de link equivlant
      }
    } else {
      if (!obj[k].hasOwnProperty('children') || obj[k].children.length <= 0) continue;
      var ret = getUrl(pairUrl, currentLng, enMenu[k].children, deMenu[k].children, obj[k].children);
      if(typeof ret != 'undefined') return ret;
    }
  }
}


function getLanguagePair(currentLng, pairUrl) {
  //  'find url in json tree'
  var enMenu = linkTreeObject.langs[1].lines.menu
  var deMenu = linkTreeObject.langs[0].lines.menu

  let obj = {}
    // find position in tree
  if (currentLng === 'de') {
    obj = deMenu
  } else {
    obj = enMenu
  }

  return getUrl(pairUrl, currentLng, enMenu, deMenu, obj)
}

//works
console.log(getLanguagePair("en", "/en/how-it-works"))
console.log(getLanguagePair("en", "/en/popular-projects"))
console.log(getLanguagePair("de", "/de/anleitung"))
console.log(getLanguagePair("de", "/de/beliebte-projekte"))


//fail
console.log(getLanguagePair("en", "/en/services/compliance"))
console.log(getLanguagePair("en", "/en/popular-projects/compliance"))
console.log(getLanguagePair("en", "/en/popular-projects/compliance/compliance-eng"))

票数 1
EN

Stack Overflow用户

发布于 2017-05-19 11:04:10

递归函数中存在一个问题。如果在第一个函数调用时不匹配url,则可以递归地再次调用函数,但不返回

代码语言:javascript
复制
function get_10_recursive(number){
  if(number>=10) return 10;
  else return get_10_recursive(number++);
}

在本例中,如果数字小于10,则递归调用该函数,直到它遇到返回语句,然后它会重新跟踪堆栈并返回正确的结果。如果删除第三行中的return语句,代码也会执行,但它只返回第一个调用的结果,这是未定义的。

代码中的问题是,如果在for循环中放置返回,循环就会被中断,并且不会检查下一个字符串,因此您必须将函数调用的结果存储在一个临时变量中,并且只有在它是真实的(也就是它不是未定义的)时才返回它。

您的getUrl函数如下所示:

代码语言:javascript
复制
function getUrl(pairUrl, currentLng, enMenu, deMenu, obj) {
  for (var k in obj) {
    if (obj[k].link === pairUrl) {
      if (currentLng === 'de') {
        return enMenu[k].link; // get en link equivlant
      } else {
        return deMenu[k].link; // get de link equivlant
      }
    } else {
      if (obj[k].hasOwnProperty('children')){
      var tmp =  getUrl(pairUrl, currentLng, enMenu[k].children, deMenu[k].children, obj[k].children);
      if(tmp) return tmp; // check if it found the match successfully
      }
    }
  }
}

PS:我记得if (!obj.hasOwnProperty(k)) continue是因为它没用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44067246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档