Javascript菜单递归函数错误

时间:2017-05-19 10:09:28

标签: javascript json recursion

//当前的jsfiddle http://jsfiddle.net/0ht35rpb/45/

我正在尝试循环浏览一个json导航树 - 这样当一个人去某个特定页面时,它会发现它的替代语言对应部分。

// JSON

{
    "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 as en CURRENTURL as / en / services

fetchFooterUrls()中的

- 我想用[“/ en / services”,“/ de / dienstleistungen”]返回一个数组 这个代码在试图获得第3级导航计数器部件时失败了 [“/ en / popular-projects / compliance / compliance-eng”,“/ de / beliebte-projekte / compliance / compliance-pruefung-kmu”]

  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]
  }

//尝试制作此片段 - 此处的任何版主都要解决?

    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"))

2 个答案:

答案 0 :(得分:1)

更新了jsfiddle。您在else部分中遇到与递归函数调用相关的错误。 http://jsfiddle.net/gaganshera/0ht35rpb/51/

将其更改为

from plyer import notification



ImportError: cannot import name 'notification'




答案 1 :(得分:1)

您的递归函数存在问题。如果您在第一个函数调用处不匹配该网址,则会再次递归调用该函数,但您不会将其返回

function get_10_recursive(number){
  if(number>=10) return 10;
  else return get_10_recursive(number++);
}

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

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

你的getUrl函数变成这样:

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,因为它没用了