json站点地图中的Javascript部分通配符匹配
Posted
技术标签:
【中文标题】json站点地图中的Javascript部分通配符匹配【英文标题】:Javascript partial wildcard matching in a json sitemap 【发布时间】:2017-11-30 18:37:41 【问题描述】:我正在做一个有语言切换的项目。所以它会获取当前的 url,遍历一个 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 等生成通配符结果。
我认为这是一种创建 else if 的情况——此时允许表达通配符匹配对,但不确定从哪里开始。
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)与Url(1)匹配,那么我们可以得到对应的链接并将通配符替换为匹配的值。
我已经创建了您的代码here 的更新,请检查。
【讨论】:
您在 getUrl 函数中有一堆 ifs - 这些条件会比 if、elseif、else 条件更好吗? jsfiddle.net/0ht35rpb/84 - 如果你有一个像 /en/service/[:num]/borderline 这样的 url 会起作用吗 没有什么不同,因为在每个IF里面都应该有返回值,所以后面的IF就达不到了。如果您想更新以使用 IF...ELSE,没关系。通配符不必在链接末尾,因此它适用于 /en/service/[:num]/borderline 之类的 url 您的代码在其他 url 匹配项上中断 -- jsfiddle.net/0ht35rpb/86 -- console.log(getLanguagePair("de", "/de/beliebte-projekte/compliance/compliance-pruefung-kmu") ) -- 不会得到解决 旧代码能够解决深层嵌套 -- jsfiddle.net/0ht35rpb/85【参考方案2】:请考虑: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
的其余部分(如果有)。
那么得到的链接就是对应的等价+尾。
希望对你有帮助。
【讨论】:
以上是关于json站点地图中的Javascript部分通配符匹配的主要内容,如果未能解决你的问题,请参考以下文章
text Gulp Node js将HTML解析为Firebase json和txt站点地图