简体   繁体   English

通过2级深的键值查找对象

[英]find an object by key values 2 levels deep

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

In the below you can click on shop-all and 23 will be returned because 23 is the ID in the same obj as the the query, shop-all ... BUT when the query is in a child node like blade-servers — id: 26 should return but it doesnt because .find is not looking in the children node. 在下面你可以点击shop-all23将被退回,因为23是相同的ID OBJ的查询, shop-all ......但是,当查询是像一个孩子节点blade-servers - ID :26应该返回,但不会返回,因为.find不在children节点中查找。

How do i rewrite 我该如何改写

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

so that it will also look in the children node of each? 这样它也会在每个children节点的children节点中查找?

 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> 

Maybe I need to map .children:[i] to the parent level? 也许我需要将.children:[i]映射到父级?

To find the child ID or the parent ID, you might use reduce to check the parent's ID and then .find a matching child, if any. 要查找子代 ID 父代ID,您可以使用reduce来检查父代ID,然后.find匹配的子代(如果有)。 A plain .find alone won't be enough here: 一个普通的.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);

If you add more levels later, better to use a recursive function instead. 如果以后添加更多级别,最好改用递归函数。

 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> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM