我有父子JSON数据,我希望从选定的父级中获取所有子项(嵌套子项)。
例如,我有JSON数据:
[{
"id": 1,
"parent": 0,
"name": "Parent"
}, {
"id": 2,
"parent": 1,
"name": "Child 1"
}, {
"id": 3,
"parent": 2,
"name": "Grand Child 1"
}, {
"id": 4,
"parent": 2,
"name": "Grand Child 2"
}, {
"id": 5,
"parent": 1,
"name": "Child 2"
}]
我有函数findAllChildren(1),其中" 1"是父母"然后功能的结果应该是:
[{
"id": 2,
"parent": 1,
"name": "Child 1"
}, {
"id": 3,
"parent": 2,
"name": "Grand Child 1"
}, {
"id": 4,
"parent": 2,
"name": "Grand Child 2"
}, {
"id": 5,
"parent": 1,
"name": "Child 2"
}]
在其他情况下,如果我调用findAllChildren(2),该函数的结果应如下所示:
[{
"id": 3,
"parent": 2,
"name": "Grand Child 1"
}, {
"id": 4,
"parent": 2,
"name": "Grand Child 2"
}]
创建函数解决该案例的正确方法是什么?谢谢。
答案 0 :(得分:3)
您可以迭代原始数据并查找具有指定标识为parent_id的项目。如果找到,请使用元素的id递归执行相同的操作。
请在此处查看:https://jsfiddle.net/6ydog1tj/2/
function findAllChildren (id, results, depth) {
for (d in data) {
if (data[d].parent == id) {
data[d].depth = depth
results.push(data[d])
findAllChildren(data[d].id, results, depth + 1)
}
}
}
var results = []
findAllChildren(1, results, 0)
$('body').append(results.map(function (element) { return Array(element.depth + 1).join(' -> ') + element.name + '<br>' }))
console.log(results)
打印出来
Child 1
-> Grand Child 1
-> Grand Child 2
Child 2
答案 1 :(得分:2)
我建议迭代所有数据,并使用属性构建一个类似于对象的树,以使用所有给定的function getDescendant(id) {
var result = [];
Array.isArray(object[id].children) && object[id].children.forEach(function iter(a) {
result.push({ id: a.id, parent: a.parent, name: a.name });
Array.isArray(a.children) && a.children.forEach(iter);
});
return result;
}
var data = [{ id: 1, parent: 0, name: "Parent" }, { id: 2, parent: 1, name: "Child 1" }, { id: 3, parent: 2, name: "Grand Child 1" }, { id: 4, parent: 2, name: "Grand Child 2" }, { id: 5, parent: 1, name: "Child 2" }],
object = function (data, root) {
var o = {};
data.forEach(function (a) {
a.children = o[a.id] && o[a.id].children;
o[a.id] = a;
o[a.parent] = o[a.parent] || {};
o[a.parent].children = o[a.parent].children || [];
o[a.parent].children.push(a);
});
return o;
}(data, 0);
console.log(getDescendant(1));
console.log(getDescendant(2));
console.log(object);
开始搜索。
然后对象走了,孩子们迭代了结果。
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
<% if(session.getAttribute("email") != null)
{
out.println(session.getAttribute("email"));
}else{ %>
<a href="/login-admin" class="btn btn-default"style="color:#4b4f54; font-weight:bold; border:1px solid #4b4f54;">Log In</a>
<%} %>
&#13;
答案 2 :(得分:1)
您可以使用Array.prototype.filter
从数组中删除与谓词条件不匹配的项目。
filter
将循环遍历数组并为每次迭代运行一个函数。返回值为true,该项将在返回的数组中。
传入过滤器的parentId
函数是 curried 。它将锁定您在作用域中搜索的父ID,并返回过滤器将运行的函数。
const data = [{
"id": 1,
"parent": 0,
"name": "Parent"
}, {
"id": 2,
"parent": 1,
"name": "Child 1"
}, {
"id": 3,
"parent": 2,
"name": "Grand Child 1"
}, {
"id": 4,
"parent": 2,
"name": "Grand Child 2"
}, {
"id": 5,
"parent": 1,
"name": "Child 2"
}]
function parentId(id) {
return function(item) {
return item.parent === id
}
}
console.log(
data.filter(parentId(2))
)
&#13;