//当前的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 zh
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"))

最佳答案

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

更改为

 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;




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

09-10 19:37