【问题标题】:search by value in object按对象中的值搜索
【发布时间】:2020-10-21 11:43:54
【问题描述】:

我有一个函数可以在节点参数中生成具有深度和子节点数量的对象。

问题是如何编写一个函数来按名称搜索树中的元素?

我试图让它像这样(下面的代码)但它没有进入子节点

const searchByName = (searchValue) => {
    for (let key in completeTree) {
        if(key.name === searchValue){
            return true
        }
    }
}

console.log(searchByName("namesurname"))

【问题讨论】:

    标签: javascript search tree


    【解决方案1】:

    可以使用如下递归函数,因为您的代码每次都会生成名称,因此请多次运行它以查看找到和未找到的结果:

    请注意,我在您的代码中更改了名称生成字符串。

    const getRandomInt = (max) => {
        return Math.floor(Math.random() * Math.floor(max));
    }
    
    function getRandomIdentifier() {
        return Math.floor(Math.random() * Math.floor(70));
    }
    
    const generateName = (names) => {
        let first = getRandomInt(names.length)
        let second = getRandomInt(names.length)
    
        return names[first] + names[second]
    }
    
    const generateTree = (depth, level, names) => {
        let dateOptions = {
            day: "numeric",
            month: "numeric",
            year: "numeric",
            hour: "numeric",
            minute: "numeric",
            millisecond: "numeric" //millisecond
        }
    
        let date = new Date()
    
        let node = {
            name: generateName(names),
            id: getRandomIdentifier(), //unique
            modificationDate: date.toLocaleString('ru', dateOptions),
            type: "folder",
            children: []
        }
    
        if (depth > 0) {
            for (let i = 0; i < level; i++) {
                node.children.push(generateTree(depth - 1, level, names));
            }
        } else {
            node.type = "file"
        }
    
        return node
    }
    
    let completeTree = generateTree(1, 5, ['aaa', 'bbb', 'ccc'])
    
    
    //recursive function like below can search in a tree of given structure
    function searchByName(searchFor,currentNode){
      let result = "not found";
      if(currentNode.name.indexOf(searchFor)!=-1){
      //found
       result = currentNode;
      }
      if(currentNode.children.length>0){
        for(let i=0; i<currentNode.children.length; i++){
          result = searchByName(searchFor,currentNode.children[i]);
          if(result!="not found"){
            break;
          }
        }
      }
      return result;
    }
    console.log("Generated Tree:");
    console.log(completeTree);
    console.log("Search Result for bbbbbb:");
    console.log(searchByName('bbbbbb',completeTree));
    console.log("Search Result for aaabbb:");
    console.log(searchByName('aaabbb',completeTree));
    console.log("Search Result for aaaccc:");
    console.log(searchByName('aaaccc',completeTree));

    【讨论】:

      【解决方案2】:

      因为你不知道先验孩子的深度,你可以使用递归的方法:

      const getRandomInt = (max) => {
          return Math.floor(Math.random() * Math.floor(max));
      }
      
      function getRandomIdentifier() {
          return Math.floor(Math.random() * Math.floor(70));
      }
      
      const generateName = (names) => {
          let first = getRandomInt(names.length)
          let second = getRandomInt(names.length)
      
          return names[first] + names[second]
      }
      
      const generateTree = (depth, level, names) => {
          let dateOptions = {
              day: "numeric",
              month: "numeric",
              year: "numeric",
              hour: "numeric",
              minute: "numeric",
              millisecond: "numeric" //millisecond
          }
      
          let date = new Date()
      
          let node = {
              name: generateName(names),
              id: getRandomIdentifier(), //unique
              modificationDate: date.toLocaleString('ru', dateOptions),
              type: "folder",
              children: []
          }
      
          if (depth > 0) {
              for (let i = 0; i < level; i++) {
                  node.children.push(generateTree(depth - 1, level, names));
              }
          } else {
              node.type = "file"
          }
      
          return node
      }
      
      let completeTree = generateTree(1, 5, ['test', 'name', 'surname'])
      console.log(JSON.stringify(completeTree, null, 2));
      
      function searchName(current, search) {
        if(current.name === search) {
          return true;
        }
        for(var i=0; i<current.children.length; i++) {
          if(searchName(current.children[i], search)){
            return true;
          }
        }
        return false;
      }
      
      console.log("contains xxxx: " + searchName(completeTree, "xxx"))
      console.log("contains " + completeTree.name + ": " + searchName(completeTree, completeTree.name))
      console.log("contains " + completeTree.children[0].name + ": " + searchName(completeTree, completeTree.children[0].name))
      console.log("contains " + completeTree.children[1].name + ": " + searchName(completeTree, completeTree.children[1].name))
            

      【讨论】:

        猜你喜欢
        • 2016-03-11
        • 2015-07-06
        • 2022-01-11
        • 2013-04-02
        • 2011-11-26
        • 2012-01-20
        • 2016-03-20
        • 2015-05-16
        相关资源
        最近更新 更多