一道前端算法题, 想了要好久没想出来如何写 . 请指导一下

发布于 2022-09-11 19:58:20 字数 668 浏览 17 评论 0

给一个数据结构如下
var data = [
{

"name": "手机",
"childs": [
    {
        "name": "iPhone",
        "childs": [
            {"name": "iPhone X"},
            {"name": "iPhone XR"},
            {"name": "iPhone XS"},
        ]
    },
    {
        "name": "HUAWEI",
        "childs": [
            {"name": "HUAWEI Mate 20"},
            {"name": "HUAWEI Mate 20 X"},
            {"name": "HUAWEI Mate 20 Pro"},
        ]
    }
]

}
];

然后让封装一个函数, 根据名称得到其遍历的路径. 例如参数是 HUAWEI Mate 20. 那么函数返回 手机 / HUAWEI/HUAWEI Mate 20. 要求函数可以适用多层的数据结构, 例如上面的数据只有三层深度, 如果扩展为 10 层的话函数仍然可以适用.

这个题目的其实就是一个树的遍历, 然后返回这个遍历路径. 但是想了半天没想到如何写

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

雨后彩虹 2022-09-18 19:58:20
function f() {
    var s = getPath("HUAWEI Mate 20 Pro", data[0], "");
    console.log(s)
}

/**
 * 
 * @param search  查询的子节点
 * @param parent  根节点
 * @param path    路径
 * @returns {*}
 */
function getPath(search, parent, path) {
    path = path + "/" + parent.name;
    if (parent.name == search) return path;
    if (parent.childs != null && parent.childs.length > 0) {
        var childs = parent.childs;
        for (var i = 0; i < childs.length; i++) {
            var t = getPath(search, childs[i], path);
            if (t == undefined || t == null || t == "") {
                continue;
            } else {
                return t;
            }
        }
    }
}
み格子的夏天 2022-09-18 19:58:20
let path = [];
function getTree(data,extend) {
  for (let z = 0; z < data.length; z++) {
       const _data = data[z];
       let extendarray = extend?JSON.parse(JSON.stringify(extend)):[];
       if (_data.childs) {
            extendarray.push(_data.name)
            getTree(_data.childs,extendarray)
        }else{
           extendarray.push(_data.name)
            path.push(extendarray)
        }
    }
}
getTree(data);
console.log(path);

这样

淡写薰衣草的香 2022-09-18 19:58:20
const find = (target, childArr, curPath = '') => {
  for (let i = 0; i < childArr.length; i += 1) {
    const {name, childs} = childArr[i]
    const path = `${curPath}${curPath ? '/' : ''}${name}`
    if (name === target) return path
    if (childs) {
      const rtn = find(target, childs, path)
      if (rtn) return rtn
    }
  }
}

console.log(find('iPhone XR', data))
陪我终i 2022-09-18 19:58:20
function getNamePath(data, name) {
  let namePath = ''

  function _getNamePath(childs, parentNamePath) {
    for (const child of childs) {
      if (child.name === name) {
        namePath = parentNamePath + '/' + name
      } else {
        const childs = child.childs
        if (childs && childs.length > 0) {
          let newParentNamePath = parentNamePath + '/' + child.name
          _getNamePath(childs, newParentNamePath)
        }
      }
    }
  }
  _getNamePath(data, '')
  return namePath
}

console.log(getNamePath(data, 'HUAWEI Mate 20 Pro'))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文