2017-06-27 72 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

所以

/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

你可以使用正則表達式來存檔你想要的結果。最初的想法是用相應的正則表達式替換鏈接中的每個通配符。然後我們可以使用正則表達式來比較兩個字符串。
實施例:

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

如果正則表達式(3)與地址匹配的(1),則我們可以得到相應的鏈路,並與匹配的值替換通配符。

我已經創建了代碼here的更新,請檢查。

+0

你在getUrl函數中有一堆ifs - 這些會更好,就像if,elseif,else conditions? http://jsfiddle.net/0ht35rpb/84/ –

+0

- 這會工作,如果你有像/ en/service/[:num]/borderline –

+0

這樣的網址沒有什麼不同,因爲在每個IF中它應該返回值,所以以下IF將不會被達到。如果你想更新以使用IF ... ELSE,那就行了。通配符不必在鏈接結束時使用,因此它可以用於像/ en/service/[:num]/borderline –

0

請考慮一下:http://jsfiddle.net/jg4cgkm8/

我已經刪除[:num]不必要的從這裏開始:

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

並如下更新function getUrl

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)檢查pairUrl是否從obj[k].link開始,var tail包含pairUrl的其餘部分(如果有的話)。

然後生成的鏈接是相應的等效+尾部。

希望它有幫助。