2016-12-15 147 views
0

所以我使用Vue來過濾一個列表。這包括以下結構的(Baum Hierarchy如果有人有興趣):如何在Javascript/Lodash/ES6中搜索父對象和子對象?

[ 
    { 
    "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父母可以有很多(或沒有)孩子,但這些孩子不能生孩子。

我想搜索/過濾器兩個父領域,字段中的孩子。如果在孩子中找到,我想返回父對象。

我可以過濾使用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; 
+0

哇,我從來沒有想到這一點做到這一點!這很好用!非常感謝 – Kingsley