账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    javascript 树状搜寻 数组
    57
    0

    前端上的需求,需要写一个搜寻的 function 来遍历这个树,

    function search(nodes, keyword){
    //预期输入 如下方的 `const nodes`
    }
    const searchedNodes = search(nodes, "1-1-2-1"); 
    // 预期要输出包含 "1-1-2-1"的所有节点以及该节点的父节点
    /*
    searchedNodes 应该要相等于
    [
        {
        value: "1-1",
        children: [
          { value: "1-1-2", children:[
            {
              value: "1-1-2-1",
              children: [
                { value: "1-1-2-1-1" }
              ]
            }
          ] }
        ]
      }
    ]
    */
    
    const nodes = [
      {
        value: "1-1",
        children: [
          { value: "1-1-1"},
          { value: "1-1-2", children:[
            {
              value: "1-1-2-1",
              children: [
                { value: "1-1-2-1-1" },
                { value: "1-1-2-1-2" }
              ]
            },
            {
              value: "1-1-2-2"
            }
          ] }
        ]
      },
      {
        value: "1-2",
        children: [
          { value: "1-2-1"},
          { value: "1-2-2", children:[
            {
              value: "1-2-2-1",
              children: [
                { value: "1-2-2-1-1" },
                { value: "1-2-2-1-2" }
              ]
            },
            {
              value: "1-2-2-2"
            }
          ] }
        ]
      },
    ];

    请问这样的树搜寻应该要怎麽完成呢?

    2018-06-26 更新

    昨晚自己折騰了一會 寫了一個 DFS 的版本 效能似乎不太好 但堪用

    const search = (nodes, keyword) => {
        let newNodes = [];
        for (let n of nodes) {
          if (n.children) {
            const nextNodes = this.keywordFilter(n.children, keyword);
            if (nextNodes.length > 0) {
              n.children = nextNodes;
            } else if (n.label.toLowerCase().includes(keyword.toLowerCase())) {
              n.children = nextNodes.length > 0 ? nextNodes : [];
            }
            if (
              nextNodes.length > 0 ||
              n.label.toLowerCase().includes(keyword.toLowerCase())
            ) {
            
              newNodes.push(n);
            }
          } else {
            if (n.label.toLowerCase().includes(keyword.toLowerCase())) {
              newNodes.push(n);
            }
          }
        }
        return newNodes;
      };
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 穿着碎花裙的少女 普通会员 1楼

      在JavaScript中,我们可以使用数组的sort()方法或者indexOf()方法来实现树状搜索。但是,对于大型的数组,这些方法可能会导致性能问题。

      因此,我们可以使用更高效的方法,例如使用二叉搜索树(Binary Search Tree,BST)或者平衡二叉搜索树(Balanced Binary Search Tree,BBST)来实现树状搜索。

      以下是一个使用平衡二叉搜索树实现树状搜索的例子:

      javascript function searchBST(arr, target) { let left = 0; let right = arr.length - 1; while (left <= right) { let mid = Math.floor((left + right) / 2); if (arr[mid] === target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; }

      在这个例子中,我们首先将数组分成两个部分,然后使用二分搜索来查找目标值。如果找到目标值,我们就返回它的索引。如果找不到,我们就返回-1。

      这种方法的时间复杂度是O(log n),因为每次查找都在二分搜索的范围内进行。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部