【问题标题】:How to get the value of each node of the tree structure如何获取树结构每个节点的值
【发布时间】:2019-10-24 09:36:25
【问题描述】:

嵌套数组和对象的数组,每个节点都有唯一的值,在这个数据上找一个值,如何获取每个节点上的值?

const opts = [
    {
        value: '01',
        children: [
            { value: '0198' },
            { value: '0195', children: [{ value: '09977' }] }
        ]
    },
    {
        value: '02',
        children: [
            { value: '01986' },
            {
                value: '0195',
                children: [
                    { value: '09978', children: [{ value: '09864' }, { value: '90876' }] }
                ]
            }
        ]
    }
];

const code = '90876';
// expected get an array ['02','0195','09978','90876']

【问题讨论】:

  • 值不应该是["01","0198","0195","09977","02","01986","0195","09978","09864","90876"] 吗?
  • 我预计结果应该是树结构中唯一路径上的每个节点值到目标值的列表

标签: javascript algorithm


【解决方案1】:

你可以使用函数递归遍历对象结构,如described here

const opts = [
    {
        value: '01',
        children: [
            { value: '0198' },
            { value: '0195', children: [{ value: '09977' }] }
        ]
    },
    {
        value: '02',
        children: [
            { value: '01986' },
            {
                value: '0195',
                children: [
                    { value: '09978', children: [{ value: '09864' }, { value: '90876' }] }
                ]
            }
        ]
    }
];


function eachRecursive(obj, cb) {
    for (var k in obj) {
        if (typeof obj[k] == "object" && obj[k] !== null)
            eachRecursive(obj[k], cb);
        else
            cb(obj[k]);
    }
}

let results = [];

eachRecursive(opts, val => results.push(val));
console.log(results);

但不确定你的评论是什么意思:// expected get an array ['02','0195','0997','90876'] 你能解释一下你为什么这么期待吗?

【讨论】:

  • 对不起,应该是 ['02','0195','09978','90876']。这意味着每个节点值的列表。
  • 我仍然不清楚为什么这是您的主题的预期答案(“如何获取树结构的每个节点的值”)......我认为你真正想要的是通向某个值的路径?! ...如果是这样,请查看 user753642 的答案。
【解决方案2】:

您可以使用dfs 算法

function dfs(o, target){
    if(o.value == target) return [target];
    if(!o.children) return false;
    let path;
    o.children.find(x=>path=dfs(x, target));
    if(path){
        return [o.value].concat(path);
    }
};

const opts = [
    {
        value: '01',
        children: [
            { value: '0198' },
            { value: '0195', children: [{ value: '09977' }] }
        ]
    },
    {
        value: '02',
        children: [
            { value: '01986' },
            {
                value: '0195',
                children: [
                    { value: '09978', children: [{ value: '09864' }, { value: '90876' }] }
                ]
            }
        ]
    }
];

let path;
opts.find(x=>path=dfs(x, '90876'))
console.log(path);

【讨论】:

    【解决方案3】:

    const opts = [
        {
            value: '01',
            children: [
                { value: '0198' },
                { value: '0195', children: [{ value: '09977' }] }
            ]
        },
        {
            value: '02',
            children: [
                { value: '01986' },
                {
                    value: '0195',
                    children: [
                        { value: '09978', children: [{ value: '09864' }, { value: '90876' }] }
                    ]
                }
            ]
        }
    ];
    console.log(opts[1].value)
    console.log(opts[1].children[1].value)
    console.log(opts[1].children[1].children[0].value)
    console.log(opts[1].children[1].children[0].children[1].value)

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多