我有扁平層次數組如下。 我想通過數組獲取特定節點的路徑。如何從平展數組中找到父節點路徑?
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]
您有什麼建議嗎?
我有扁平層次數組如下。 我想通過數組獲取特定節點的路徑。如何從平展數組中找到父節點路徑?
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]
您有什麼建議嗎?
您可以對所有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]
您可以定義與id
值相匹配的設置key
參數找到數組中的項的遞歸函數,然後檢查當前項具有parent_id
truthy值。
如果有parent_id
:
功能將定義results
作爲一個數組,如果它沒有被傳遞到函數,並隨後將添加當前項目的parent_id
到results
陣列前端。接下來,它會自動調用以下三個參數:
arr
)。parent_id
作爲key
來看看下。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));
這是我簡單的回答對您想要達到的目標:
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);
我剛纔用遞歸和它的偉大工程。
獲得所需輸出的遞歸函數。
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);
您是否嘗試過自己寫的這個功能呢?你需要什麼樣的建議?你沒有顯示任何嘗試。 – Xufox
對不起,我無法解決這個問題,還有更多我不是英文母語,所以我無法解釋我的想法。 – Chris