如何在 Javascript/Lodash/ES6 中同时搜索父对象和子对象?
Posted
技术标签:
【中文标题】如何在 Javascript/Lodash/ES6 中同时搜索父对象和子对象?【英文标题】:How to search both parent and child object in Javascript/Lodash/ES6? 【发布时间】:2017-05-01 15:37:02 【问题描述】:所以我使用 Vue 来过滤列表。这包括以下结构(Baum Hierarchy,如果有人感兴趣的话):
[
"id": 61,
"created_at": "2016-11-23 22:07:10",
"updated_at": "2016-12-15 19:44:56",
"parent_id": null,
"lft": 107,
"rgt": 116,
"depth": 0,
"name": "Quia eos voluptas molestiae ut cum.",
"slug": "consequatur-voluptatum-dolores-non-perferendis-possimus",
"order_column": null,
"belongs_to": null,
"children": [
"id": 57,
"created_at": "2016-11-23 22:07:10",
"updated_at": "2016-12-15 19:44:56",
"parent_id": 61,
"lft": 110,
"rgt": 113,
"depth": 1,
"name": "Molestias vitae velit doloribus.",
"slug": "enim-itaque-autem-est-est-nisi",
"order_column": null,
"belongs_to": null,
"children": []
,
"name": "etc...",
每个项目都可以有无限数量的孩子,这些孩子也可以,依此类推。就我而言,我只有 2 级深,因此 1 位父母可以有很多(或没有)孩子,但这些孩子不能有孩子。
我想同时搜索/过滤父 name 字段和子中的 name 字段。如果在孩子中找到,我想返回父对象。
我可以使用 Lodash 过滤父级:
let search = this.search;
return _.filter(this.sortable, function(item)
return item.name.search(new RegExp(search, "i")) !== -1;
);
如何同时搜索父母和孩子?
【问题讨论】:
【参考方案1】:你可以用递归函数来做到这一点
var res = _.reduce(this.sortable, function reducer(result, item)
if (item.name.search(new RegExp(search, "i")) !== -1)
result.items = _.concat(result.items, result.parent || item);
result.items = _.concat(
result.items,
_.reduce(item.children, reducer, parent: item, items: []).items
)
return result;
, items: []).items;
【讨论】:
哇,我从来没想过!这完美!非常感谢 它只返回直接父节点而不是节点的整个路径,直到搜索匹配的叶子节点以上是关于如何在 Javascript/Lodash/ES6 中同时搜索父对象和子对象?的主要内容,如果未能解决你的问题,请参考以下文章