我有以下树视图数据:
[
{
"id":132,
"parent_id":0,
"title":"Item 1",
"description":"",
"nodes":[
{
"id":133,
"parent_id":132,
"title":"Item 1.1",
"description":"",
"nodes":[
{
"id":134,
"parent_id":133,
"title":"Item 1.1.1",
"description":"",
"nodes":[],
}
]
}
]
},
{
"id":135,
"parent_id":0,
"title":"Item 2",
"description":"",
"nodes":[ ]
},
{
"id":136,
"parent_id":0,
"title":"Item 3",
"description":"",
"nodes":[
{
"id":137,
"parent_id":136,
"title":"Item 3.1",
"description":"",
"nodes":[ ]
}
]
}
]
我需要按所有子值中的标题和描述进行过滤,如果找到子值,则显示所有父级,以遵循层次结构。
我尝试使用这样的一些,但它只适用于第一个父母的标题:
this.visible = function (item) {
return !(this.query && this.query.length > 0 &&
item.title.indexOf(this.query) == -1);
};
答案 0 :(得分:1)
这样的事情怎么样?
var items = [
{
"id":132,
"parent_id":0,
"title":"Item 1",
"description":"",
"nodes":[
{
"id":133,
"parent_id":132,
"title":"Item 1.1",
"description":"",
"nodes":[
{
"id":134,
"parent_id":133,
"title":"Item 1.1.1",
"description":"",
"nodes":[],
}
]
}
]
},
{
"id":135,
"parent_id":0,
"title":"Item 2",
"description":"",
"nodes":[ ]
},
{
"id":136,
"parent_id":0,
"title":"Item 3",
"description":"",
"nodes":[
{
"id":137,
"parent_id":136,
"title":"Item 3.1",
"description":"",
"nodes":[ ]
}
]
}
];
function filter(queryFunc, items){
if (!Array.isArray(items)){
console.error('Items is not an array!');
return;
}
if (typeof queryFunc != 'function'){
console.error('Please provide a query function.');
return;
}
function descend(item, parents){
let results = [];
if (queryFunc(item))
results.push([item, parents])
for (let i=0; i<item.nodes.length; i++)
results = results.concat(
descend(item.nodes[i], parents.concat([item.id]))
);
return results;
}
let results = [];
for (let i=0; i<items.length; i++)
results = results.concat(descend(items[i], []));
return results;
}
var as = filter(x => /item\s*1/i.test(x.title), items);
var bs = filter(x => x.title == 'Item 3.1', items);
console.log('as:');
as.map(x => console.log(JSON.stringify(x[0]) + '\n\n Parents: ' + JSON.stringify(x[1])));
console.log('bs:');
console.log(JSON.stringify(bs[0][0]) + '\n\nParents: ' + JSON.stringify(bs[0][1]));
/* https://stackoverflow.com/users/1447675/nina-scholz */
.as-console-wrapper { max-height: 100% !important; top: 0; }