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部分通配符匹配的主要内容,如果未能解决你的问题,请参考以下文章

部分JSON解组到Go中的地图中

text Gulp Node js将HTML解析为Firebase json和txt站点地图

Echart地图城市用json返回格式

使用 JSON 数据使用数据库对象填充 Google 地图

javascript for arcgis 遍历站点在地图上显示后,造成平移缓慢,一顿一顿的效果,请大神们指点

JSON和JS重复检查索引号(PURE JAVASCRIPT)