如何从flattened数组中找到父节点路径?

时间:2017-08-31 05:59:57

标签: javascript

我按照以下方式展平了层次结构数组。 我想把特定节点的路径作为数组。

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]

你有什么建议吗?

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数组的前面。接下来,它将使用以下三个参数调用自身:

  1. 起始数组(arr)。
  2. 当前项目的parent_idkey,可以查看下一个。
  3. results数组作为完成后要返回的数组。
  4. 如果没有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;
&#13;
&#13;

我刚刚使用了递归,效果很好。

答案 3 :(得分:0)

递归函数以获得所需的输出。

&#13;
&#13;
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;
&#13;
&#13;