鍍金池/ 問(wèn)答/HTML/ 返回json對(duì)象中最匹配的值

返回json對(duì)象中最匹配的值

var jsonObj = [
    {
        id: 1,
        name: '首頁(yè)',
        path: '/dashboard',
        children: []
    },
    {
        id: 2,
        name: '權(quán)限',
        path: '/auth',
        children: [
            {
                id: 3,
                name: '角色',
                path: '/auth/role',
                children: [
                ]
            }
        ]
    }
]
var pathStr = '/auth/role/list'

有上面兩個(gè)變量jsonObj和pathStr,如果在jsonObj中有path屬性對(duì)應(yīng)的值和pathStr相同的,那么就返回pathStr,如果沒有相同的,就找和pathStr最接近的,比如在此例中最終返回的是'/auth/role'

回答
編輯回答
淺淺

DFS 思路供參考

function matchPath (pathSrc, jsonObj) {
  let bestMatch = ''
  _match(jsonObj)
  return bestMatch

  function _match (list) {
    if (!Array.isArray(list)) { return }
    for (let i = 0; i < list.length; i++) {
      const { path = '', children } = list[i]
      if (path === pathSrc) {
        bestMatch = pathSrc
        return
      }
      if (pathSrc.startsWith(path) && path.length > bestMatch.length) {
        bestMatch = path
      }
      if (children) {
        _match(children)
      }
    }
  }
}
2017年2月23日 20:37
編輯回答
孤星

比較亂,我也不知道自己寫的啥東西

var pathStrArr = pathStr.split('/')
var key1 = 0;
var key2 = 0;

var a = {
  path:'',
  search:function(obj){
      var that = this;
    obj.forEach(function(i){
        console.log(i.path);
        var iArr = (i.path).split('/')
        for(var j in iArr){
          if(iArr[j] == pathStrArr[j])
           key1++;
         }
        if(key1>key2){
          this.path = i.path;
          key2 = key1;
          key1 = 0;
          
        }
        if(i.children){
          that.search(i.children);
        }
      });  
  }
}

a.search(jsonObj)
console.log(path)

https://codepen.io/jx915/pen/...

2017年3月11日 04:27
編輯回答
葬愛
function trans (arr, path, cur) {
    cur = cur || ''
    for (let i = 0, len = arr.length; i < len; i++) {
        let name = arr[i].path
        if (path.startsWith(name)) {
            let children = arr[i].children
            let result = children && children.length ? trans(children, path, name) : name
            if (result === path) return path
            if (result.length > cur.length) cur = result
        }
    }
    return cur
}
trans(jsonObj, pathStr)
2018年1月29日 02:11