从父子JSON数据中获取所有子项

时间:2016-10-11 11:19:39

标签: javascript jquery json algorithm search

我有父子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"
}]

创建函数解决该案例的正确方法是什么?谢谢。

3 个答案:

答案 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);开始搜索。

然后对象走了,孩子们迭代了结果。

&#13;
&#13;
.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;
&#13;
&#13;

答案 2 :(得分:1)

您可以使用Array.prototype.filter从数组中删除与谓词条件不匹配的项目。

filter将循环遍历数组并为每次迭代运行一个函数。返回值为true,该项将在返回的数组中。

传入过滤器的parentId函数是 curried 。它将锁定您在作用域中搜索的父ID,并返回过滤器将运行的函数。

&#13;
&#13;
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;
&#13;
&#13;