您好,匿名用户

一道算法题,有会的可以一起讨论下

0 投票

const data = {

    name: 'A',
    child: [{
            name: 'AB',
            child: [{
                    name: 'AABA'
                },
                {
                    name: 'AABB'
                }
            ]
        },
        {
            name: 'AC',
            child: [{
                    name: 'AACA'
                },
                {
                    name: 'AACB'
                }
            ]
        }
    ]
}
// 请自行封装一个findPath的函数,实现如下效果
// 调用示例

findPath('AABB'); //["A", "AB", "AABB"]

findPath('AABA'); //["A", "AB", "AABA"]

findPath('AACB'); //["A", "AC", "AACB"]

findPath('AC'); //["A", "AC"]

findPath('AACA'); //["A", "AC", "AACA"]

用户头像 提问 5月22日 @ Redis 中士 (1,094 威望)
分享到:

1个回答

0 投票
 
最佳答案

这种算法最适合用递归吧

const findPath = (name, data, result = []) => {
  let _result;
  for (const item of data) {
    if (item.name === name) {
      return [...result, item.name];
    } else if (item.child) {
      _result = findPath(name, item.child, [...result, item.name]);
      if (_result) {
        return _result;
      }
    }
  }
};

findPath('AACB', [data]);

@李十三 的观点很好,直接判断键名就能拿到结果了,只需一次计算,如果需要多次调用应该是最优解

const dataReduce = (data, parent = [], result = {}) => {
  data.forEach(item => {
    result[item.name] = [...parent, item.name];
    item.child && dataReduce(item.child, result[item.name], result);
  });
  return result;
};

const _data = dataReduce([data]);

_data['AACB'];//["A", "AC", "AACB"]
用户头像 回复 5月22日 @ Maokai 中士 (1,427 威望)
选中 5月12日 @Redis
提一个问题:

相关问题

0 投票
1 回复 3 阅读
0 投票
1 回复 5 阅读
0 投票
1 回复 168 阅读
0 投票
1 回复 4 阅读
0 投票
1 回复 6 阅读
用户头像 提问 5月6日 @ Pikachu 中士 (1,425 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...