我按照以下方式展平了层次结构数组。 我想把特定节点的路径作为数组。
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 :(得分: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]
答案 1 :(得分:0)
您可以定义一个递归函数,该函数使用与提供的id
参数匹配的key
值查找数组中的项,然后检查当前项是否具有parent_id
真值
如果有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));
答案 2 :(得分: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){
res.push(arr[i].parent_id);
}
}
}
}
getPath(arr, 5);
console.log(res);
&#13;
我刚刚使用了递归,效果很好。
答案 3 :(得分: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) {
for(var i in arr) {
if(arr[i].id === num) {
//console.log(num);
getPath(arr, arr[i].parent_id);
resultArr.push(num);
break;
}
}
return resultArr.slice(0, (resultArr.length - 1));
}
var res = getPath(arr, 5);
console.log(res);
&#13;