2017-06-06 42 views
0

比方說,我有JavaScript對象以下從JavaScript對象的屬性創建路徑

var obj = { 
      a:{ 
       b:"value", 
       c:{ 
        d:"value2" 
       } 
      } 
     } 

什麼功能會,當用「d」對象輸入(例如,function getPath(obj, d)),輸出「ACD」串?我嘗試過各種各樣的事情,包括object-path,但它似乎並沒有被設計用於

+4

你能ELABO用「d」對象「*」輸入「*」請提供一個這樣的函數調用的例子。如果你的意思是'path(obj.acd)',那麼就沒有辦法得到想要的結果(因爲所有的函數都是字符串值「value2」),它不知道,也不知道'obj')。 –

+2

你想用這個做什麼?如果另一個財產有一個孩子'd'呢?如果父母是'd'呢? – baao

+1

當被問及d時,對obj = {d:{d:{d:{d:「val」}}}}「如何反應?它是否返回'd','d.d','d.d.d'或'd.d.d.d'? –

回答

0

可以遍歷使用遞歸函數的對象,並保存喜歡的路徑:

function getPath(object, keyValue, path) { 
 
    for (var k in object) { 
 
    if (k === keyValue) { 
 
     return path + '.' + k; 
 
    } 
 
    else if (typeof object[k] === 'object') { 
 
     return getPath(object[k], keyValue, path !== '' ? path + '.' + k : k); 
 
    } 
 
    } 
 
} 
 

 
var obj = { 
 
    a:{ 
 
     b:"value", 
 
     c:{ 
 
      d:"value2" 
 
     } 
 
    } 
 
}; 
 

 
var path = getPath(obj, 'd', ''); 
 
console.log(path);

+2

對於測試用例'obj = {d:{d:{d:{d:「val」 }}}}' –

+0

啊!你是對的 ! – Bibzer

0

在這裏,你去。要使用的功能是findLongestPath

var obj = { 
 
    a:{ 
 
     b:"value", 
 
     c:{ 
 
      d:"value2" 
 
     } 
 
    } 
 
}; 
 

 
function findAllPaths(obj, property, startString = '') { 
 
    var pathStrings = []; 
 
    Object.keys(obj).forEach(key => { 
 
    if(typeof obj[key] === 'object') { 
 
     pathStrings.push(...findAllPaths(obj[key], property, startString + key + '.')); 
 
     return; 
 
    } 
 
    
 
    pathStrings.push(startString + key); 
 
    }); 
 
    
 
    return pathStrings; 
 
} 
 

 
function findLongestPath(obj, property) { 
 
    return findAllPaths(obj, property) 
 
    .filter(str => str.split('').reverse().join('').slice(0, property.length) === property.split('').reverse().join('')) 
 
    .reduce((longest, next) => longest.length >= next.length ? longest : next, ''); 
 
} 
 

 
console.log(findLongestPath(obj, 'd'));

findAllPaths是遞歸函數,通過該對象進行迭代,並且生成所有可能的對象路徑的陣列。 findLongestPath過濾這些字符串以確保最後一個屬性與給定的屬性匹配,然後返回其中最長的屬性。

+0

請注意,如果其中一個屬性不是對象或字符串,則會中斷。 –

1

您可以使用迭代和遞歸方法。

function getPath(object, key) { 
 

 
    function iter(o, p) { 
 
     if (typeof o === 'object') { 
 
      return Object.keys(o).some(function (k) { 
 
       return iter(o[k], p.concat(k)); 
 
      }); 
 
     } 
 
     if (p[p.length - 1] === key) { 
 
      path = p; 
 
      return true; 
 
     } 
 
    } 
 

 
    var path = []; 
 
    iter(object, []); 
 
    return path.join('.'); 
 
} 
 

 
console.log(getPath({ d: { d: { d: { d: 'val' } } } }, 'd')); 
 
console.log(getPath({ a: { b: 'value', c: { d: 'value2' } } }, 'd'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

我有一個有趣的相當數量使這一個,它產生可以從目標盡一切可能路徑的列表,並返回最長的一個正確的關鍵結束,它返回的不是空字符串發現:

function getPath(obj, key) { 
 
    paths = [] 
 

 
    function getPaths(obj, path) { 
 
     if (obj instanceof Object && !(obj instanceof Array)) { 
 
      for (var k in obj){ 
 
       paths.push(path + "." + k) 
 
       getPaths(obj[k], path + "." + k) 
 
      } 
 
     } 
 
    } 
 

 
    getPaths(obj, "") 
 
    return paths.map(function(p) { 
 
     return p.slice(p.lastIndexOf(".") + 1) == key ? p.slice(1) : '' 
 
    }).sort(function(a, b) {return b.split(".").length - a.split(".").length;})[0]; 
 
} 
 

 
var obj = { a:{ b:"value", c:{ d:"value2"}}}; 
 
console.log(getPath(obj, "b")) 
 
console.log(getPath(obj, "c")) 
 
console.log(getPath(obj, "d")) 
 

 
var obj = { d:{ d:"value", d:{ d:"value2"}}}; 
 
console.log(getPath(obj, "d"))