我有一些可以通过两个数据结构表示的分层数据.
第一个是多级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: []}
]
优点:每个项目都有父母和孩子的链接.
缺点:如果源数据结构是层次结构,我必须手动生成项目的键.
最佳答案 只需要同时处理这两种格式,处理映射到单一格式是不值得的.
下面我使用了Array.prototype.reduce函数(我可以使用Array.prototype.filter,但后来我不得不从递归调用中连接结果数组和/或将函数args添加到bind中).
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"), []));