如何在 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 中同时搜索父对象和子对象?的主要内容,如果未能解决你的问题,请参考以下文章

在QGIS中如何添加天地图的WMTS

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?