2017-06-27 10 views
3

言語切り替えがあるプロジェクトで作業しています。したがって、現在のURLをピックアップし、jsonオブジェクトをループし、言語ペアを返します。Javascript jsonサイトマップでの部分ワイルドカードの一致

ので

/en/cookie-policy 
/de/cookie-richtlinie 

問題私が今直面するつもりです - ワイルドカードを受け付けている - IDマッチングペア

ようなので、代わりにJSONにハードコーディング可能なすべてのIDの

/en/virtual-conference-room/1 
/de/virtuellier-konferenz-raum/1 
私はJSONでワイルドカードの種類を配置する

- 言語ペアを転写が、所望のid

012を保持します

そう

/en/virtual-conference-room/[:num] 
/de/virtuellier-konferenz-raum/[:num] 
、私は言語切替/ペアマッチを行う - .. ID 1、234、1000年などのために、私は考えて

をワイルドカード結果を生み出すそのほかの場合は作成する場合 - その時点でワイルドカードマッチペアを表現することができますが、どこから始めるべきかはわかりません。

JSFiddle

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 (paritalmatch) { 
     //finds a wild card match and allows a pair match 
    } 
    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/virtual-conference-room/1")) 
console.log(getLanguagePair("en", "/en/virtual-conference-room/2")) 

答えて

1

正規表現を使用して、必要な結果をアーカイブすることができます。オリジナルのアイデアは、リンク内の各ワイルドカードを対応する正規表現に置き換えることです。次に、正規表現を使用して2つの文字列を比較できます。
例:

(1) Url: /en/virtual-conference-room/1 
(2) Link: /en/virtual-conference-room/[:num] 
(3) Regex: /en/virtual-conference-room/(\d+) 

正規表現(3)URLと一致する場合は(1)、その後、我々は、対応するリンクを取得し、マッチした値でワイルドカードを置き換えることができます。

コードhereの更新を作成しました。確認してください。

+0

あなたはgetUrl関数にifsのスタックを持っています - これはif、elseif、else条件よりも優れていますか? http://jsfiddle.net/0ht35rpb/84/ –

+0

- あなたが/ en/service/[:num]/borderlineのようなURLを持っていた場合、これは機能しますか –

+0

これは違いはありません。次のIFには達しません。あなたがIF ... ELSEを使うように更新したいのであればOKです。ワイルドカードはリンクの最後にある必要はないので、/ en/service/[:num]/borderlineのようなURLのために動作します –

0

この検討してください:

{ 
    "title": "Virtual Conference Room", 
    "link": "/en/virtual-conference-room/" 
} 

を、以下のようにfunction getUrlを更新:私はここから不要として[:num]を削除したhttp://jsfiddle.net/jg4cgkm8/

function getUrl(pairUrl, currentLng, enMenu, deMenu, obj) { 
    for (let k in obj) { 
    if (!obj.hasOwnProperty(k)) continue; 
    if (pairUrl.indexOf(obj[k].link) === 0) { 
     var tail = pairUrl.substr(obj[k].link.length); 
     if (currentLng === 'de') { 
     return enMenu[k].link + tail // get en link equivlant 
     } else { 
     return deMenu[k].link + tail // 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; 
    } 
    } 
} 

if (pairUrl.indexOf(obj[k].link) === 0)pairUrlobj[k].linkから始まり、に残りの場合はpairUrlが含まれているかどうかをチェックします。

結果のリンクは、対応する同等+テールです。

希望します。