2017-08-31 69 views
0

我有扁平層次數組如下。 我想通過數組獲取特定節點的路徑。如何從平展數組中找到父節點路徑?

var arr = [ 

    {id:1, parent_id:null}, 
    {id:2, parent_id:1}, 
    {id:3, parent_id:null}, 
    {id:4, parent_id:2}, 
    {id:5, parent_id:4} 

] 

getPath(arr, 5) return [1,2,4] 

您有什麼建議嗎?

+0

您是否嘗試過自己寫的這個功能呢?你需要什麼樣的建議?你沒有顯示任何嘗試。 – Xufox

+0

對不起,我無法解決這個問題,還有更多我不是英文母語,所以我無法解釋我的想法。 – Chris

回答

1

您可以對所有id及其父母使用散列表並迭代,直到沒有父代可用。

function getPath(nodes, id) { 
 
    var parents = Object.create(null), 
 
     path = []; 
 

 
    nodes.forEach(function (n) { 
 
     parents[n.id] = n.parent_id; 
 
    }); 
 

 
    while (id = parents[id]) { 
 
     path.unshift(id); 
 
    } 
 
    return path; 
 
} 
 

 
var array = [{ id: 1, parent_id: null }, { id: 2, parent_id: 1 }, { id: 3, parent_id: null }, { id: 4, parent_id: 2 }, { id: 5, parent_id: 4 }]; 
 

 
console.log(getPath(array, 5)); // [1, 2, 4]

0

您可以定義與id值相匹配的設置key參數找到數組中的項的遞歸函數,然後檢查當前項具有parent_id truthy值。

如果有parent_id

功能將定義results作爲一個數組,如果它沒有被傳遞到函數,並隨後將添加當前項目的parent_idresults陣列前端。接下來,它會自動調用以下三個參數:

  1. 起始數組(arr)。
  2. 當前項目的parent_id作爲key來看看下。
  3. results數組作爲完全完成時返回的數組。

如果沒有parent_id

該函數將直接返回results陣列。

var arr = [ 
 
{id:1, parent_id:null}, 
 
{id:2, parent_id:1}, 
 
{id:3, parent_id:null}, 
 
{id:4, parent_id:2}, 
 
{id:5, parent_id:4} 
 
]; 
 

 
function getPath(arr, key, results) { 
 
    var nextObj = arr.filter(function(obj){ 
 
     return obj.id == key; 
 
    })[0]; 
 
    if(nextObj && nextObj.parent_id) { 
 
     results = typeof results !== 'object' ? [] : results; 
 
     var nextKey = nextObj.parent_id; 
 
     results.unshift(nextKey); 
 
     return getPath(arr, nextKey, results); 
 
    } 
 
    return results; 
 
} 
 

 
console.log(getPath(arr, 5));

0

這是我簡單的回答對您想要達到的目標:

var arr = [ 
 

 
    {id:1, parent_id:null}, 
 
    {id:2, parent_id:1}, 
 
    {id:3, parent_id:null}, 
 
    {id:4, parent_id:2}, 
 
    {id:5, parent_id:4} 
 
]; 
 
var res=[]; 
 
function getPath(arr, x){ 
 
    for(var i=0; i<arr.length; i++){ 
 
     if(arr[i].id== x){ 
 
      getPath(arr, arr[i].parent_id); 
 
      if(arr[i].parent_id !== null){ 
 
\t \t \t   res.push(arr[i].parent_id); 
 
      } 
 
      
 

 
     } 
 
    } 
 

 
} 
 
getPath(arr, 5); 
 
console.log(res);

我剛纔用遞歸和它的偉大工程。

0

獲得所需輸出的遞歸函數。

var arr = [ 
 

 
    {id:1, parent_id:null}, 
 
    {id:2, parent_id:1}, 
 
    {id:3, parent_id:null}, 
 
    {id:4, parent_id:2}, 
 
    {id:5, parent_id:4} 
 

 
] 
 

 
let resultArr = []; 
 

 
function getPath(arr, num) { 
 
\t for(var i in arr) { 
 
    \t if(arr[i].id === num) { 
 
    \t //console.log(num); 
 
     getPath(arr, arr[i].parent_id); 
 
     resultArr.push(num); 
 
\t \t \t break; 
 
    } 
 
    } 
 
    
 
    return resultArr.slice(0, (resultArr.length - 1)); 
 
} 
 

 
var res = getPath(arr, 5); 
 
console.log(res);

相關問題