如何索引分层数据?

时间:2015-09-29 08:58:24

标签: algorithm hierarchy hierarchical-data

我有一些可以通过两种数据结构表示的分层数据。

第一个是多级JSON对象,如下所示:

[
    { 
        "text": "Item 1, "children": [
            {"text": "Nested item 1"}, 
            {"text": "Nested item 2"}] 
    },
    {
        "text": "Item 2", "children": []
    }
]

第二个结构是一个数组。此数组的项目由id-parentId绑定。

[
    {id: 1, text: "Item 1", parentId: null},
    {id: 2, text: "Nested item 1", parentId: 1}
]

我需要通过某些子字符串过滤这些数据。

要实现此功能,我想创建一些搜索索引。然后为创建的索引提供过滤操作。

创建搜索索引的主要原因是使用单个过滤算法而不是两种不同的方法来过滤分层数据和id-parentId列表。

那么,问题是搜索索引应该采用什么格式?目前,我使用这样的东西:

[
    {id: 1, text: "item 1", parentKey: null, childrenKeys: [2,3]},
    {id: 2, text: "child 1", parentKey: 1, childrenKeys: []},
    {id: 3, text: "child 2", parentKey: 1, childrenKeys: []}  
]

优点:每个项目都有父母和子女的链接。

缺点:如果源数据结构是层次结构,我必须手动为项目生成密钥。

1 个答案:

答案 0 :(得分:2)

只需要同时处理这两种格式,处理映射到单一格式就不值得了。

下面我使用了Array.prototype.reduce函数(我可以使用Array.prototype.filter,但是我不得不从递归调用中连接结果数组和/或将函数args添加到绑定中)。 / p>

JSFiddle http://jsfiddle.net/5q4cdevt/

/* @this {string} search value */ 
function reduceContains(result, obj) {
    if(obj.text.indexOf(this) >= 0) { 
        result.push(obj); 
    }
    if(obj.children) {
        obj.children.reduce(reduceContains.bind(this), result);
    }
    return result;
}

console.log([
    { 
        "text": "Item 1", "children": [
            {"text": "Nested item 1"}, 
            {"text": "Nested item 2"}] 
    },
    {
        "text": "Item 2", "children": []
    }
].reduce(reduceContains.bind("Nested"), []));

console.log([
    {id: 1, text: "Item 1", parentId: null},
    {id: 2, text: "Nested item 1", parentId: 1}
].reduce(reduceContains.bind("Nested"), []));