代码之家  ›  专栏  ›  技术社区  ›  Omar

按键值两级查找对象

  •  1
  • Omar  · 技术社区  · 7 年前

    https://jsfiddle.net/y1tq9563/29/

    shop-all 23 将返回,因为23是查询所在对象中的ID, ... 但当查询位于子节点(如 blade-servers .find 不是在看电视 children 节点。

    如何重写

    data.find( t => t.url.includes(query).id
    

    所以它也会在 每个节点?

    const data = [
      {
        "id": 23,
        "name": "Shop All",
        "url": "/shop-all/",
        "children": []
      },
      {
        "id": 18,
        "name": "Servers",
        "url": "/Servers/",
        "children": [
          {
            "id": 26,
            "name": "Blade Servers",
            "url": "/servers/blade-servers/"
          },
          {
            "id": 24,
            "name": "Rack Servers",
            "url": "/servers/rack-servers/"
          },
          {
            "id": 25,
            "name": "Tower Servers",
            "url": "/servers/tower-servers/"
          },
          {
            "id": 27,
            "name": "Workstations",
            "url": "/servers/workstations/"
          }
        ]
      }
    ];
    
    $('.btn').click(e=> getID($(e.target).html()) );
    
    function getID(query){
        /* reset */
        $('.results').html('');
        $('.err').html('');
        
       /* search for "query" */
        try {
          const result = data.find( t => t.url.includes(query) ).id; // whats wrong here?
          $('.results').html(`<div class="res-c">${result}</div>`);
        } catch(er) {
            $('.err').html(`<div class="err-c">${er}</div>`)
        }
    }
    body {
      background: #20262e;
      color: #fff;
      font-family: monospace;
      font-size: 25px;
    }
    
    .res-c {
       color: #6CE891;
       padding: 0.5em;
       margin: 0.5em;
       border: 2px solid #6CE891;
       border-radius: 5px;
    }
    .err-c {
       color: #ff4f68;
       padding: 0.5em;
       margin: 0.5em;
       border: 2px solid #ff4f68;
       border-radius: 5px;
    }
    
    .buttons{
      margin: 0.5em;
      margin-bottom: 1em;
    }
    .btn {
      font-size: 20px;
      border: 2px solid #fff;
      border-radius: 5px;
      padding: 0.5em;
    }
    .btn:hover {
      background: #fff;
      color: #20262e;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <div class="buttons">
      <a class="btn">shop-all</a>
      <a class="btn">blade-servers</a>
    </div>
    
    <div class="results"></div>
    <div class="err"></div>

    也许我需要地图 .children:[i] 到父级?

    1 回复  |  直到 7 年前
        1
  •  2
  •   CertainPerformance    7 年前

    找到 父ID,您可以使用 reduce 检查家长的ID然后 .find 光靠自己是不够的:

    const result = data.reduce((a, { url, children, id }) => {
      if (a) return a;
      if (url.includes(query)) return id;
      const foundChild = children.find(({ url }) => url.includes(query));
      if (foundChild) return foundChild.id;
    }, null);
    

    const data = [
      {
        "id": 23,
        "name": "Shop All",
        "url": "/shop-all/",
        "children": []
      },
      {
        "id": 18,
        "name": "Servers",
        "url": "/Servers/",
        "children": [
          {
            "id": 26,
            "name": "Blade Servers",
            "url": "/servers/blade-servers/"
          },
          {
            "id": 24,
            "name": "Rack Servers",
            "url": "/servers/rack-servers/"
          },
          {
            "id": 25,
            "name": "Tower Servers",
            "url": "/servers/tower-servers/"
          },
          {
            "id": 27,
            "name": "Workstations",
            "url": "/servers/workstations/"
          }
        ]
      }
    ];
    
    $('.btn').click(e=> getID($(e.target).html()) );
    
    function getID(query){
        /* reset */
        $('.results').html('');
        $('.err').html('');
        
       /* search for "query" */
        try {
          const result = data.reduce((a, { url, children, id }) => {
            if (a) return a;
            if (url.includes(query)) return id;
            const foundChild = children.find(({ url }) => url.includes(query));
            if (foundChild) return foundChild.id;
          }, null)
          $('.results').html(`<div class="res-c">${result}</div>`);
        } catch(er) {
            $('.err').html(`<div class="err-c">${er}</div>`)
        }
    }
    body {
      background: #20262e;
      color: #fff;
      font-family: monospace;
      font-size: 25px;
    }
    
    .res-c {
       color: #6CE891;
       padding: 0.5em;
       margin: 0.5em;
       border: 2px solid #6CE891;
       border-radius: 5px;
    }
    .err-c {
       color: #ff4f68;
       padding: 0.5em;
       margin: 0.5em;
       border: 2px solid #ff4f68;
       border-radius: 5px;
    }
    
    .buttons{
      margin: 0.5em;
      margin-bottom: 1em;
    }
    .btn {
      font-size: 20px;
      border: 2px solid #fff;
      border-radius: 5px;
      padding: 0.5em;
    }
    .btn:hover {
      background: #fff;
      color: #20262e;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <div class="buttons">
      <a class="btn">shop-all</a>
      <a class="btn">blade-servers</a>
    </div>
    
    <div class="results"></div>
    <div class="err"></div>