[英]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-all
和23
将被退回,因为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.