2014-11-06 32 views
0

我有它返回它包含的子對象我要找的父對象下劃線過濾器。但我希望它只返回子對象。既然已經做才能返回父定位子對象的工作,我不知道如何來簡化我的代碼返回剛子。這裏的例子:強調JS - 尋找一個嵌套的對象

var filterObj = _.filter(filtersPath, function(obj) { 
      return _.where(obj.filters, {id: prefilterCat}).length > 0; 
     }); 

所以在這裏,裏面obj.filters嵌套的對象,與prefilterCat的ID,是我想要返回的對象,而不是它的父。因此,目前我將不得不在filterObject中進行另一次查找以獲得我需要的內容。有任何想法嗎?

+0

'_.filter'會返回一個數組這裏的「父對象」的 - 你想獲得「子對象」匹配,而不是,或只有第一個子對象的數組? – yerforkferchips 2014-11-06 20:45:52

回答

0

下劃線的filter方法將返回「父」對象,但會過濾掉不符合條件語句的人。既然如此,如果只有1的結果,那麼你可以訪問它類似於你將如何訪問數組。例如:

var filterObj = _.filter(filtersPath, function(obj) { 
     return _.where(obj.filters, {id: prefilterCat}).length > 0; 
    })[0]; 

上面的例子會得到從過濾器方法返回的第一個孩子。

+0

是 - 但問題是,孩子的濾光器陣列,其中只有一個具有匹配prefilterCat的ID。 – mheavers 2014-11-06 20:52:29

0

從你的問題和代碼,我假設的數據結構是這樣的:有一個過濾器

var filtersPath = [ 
    { 
    filters: [ 
     {id: 0}, 
     {id: 1} 
    ] 
    }, 
    { 
    filters: [ 
     {id: 5}, 
     {id: 42} 
    ] 
    } 
]; 

現在你可以得到所有「父對象」(你已經做)的一個數組含匹配ID的對象數組:

_.filter(filtersPath, function(obj) { 
    return _.find(obj.filters, { id: 5 }); 
}); 

做這種方式的優點是,它會停止搜索的價值一旦它發現一個,而不是一味遍歷整個列表。

如果你想真正得到數組作爲結果,這是一個簡單的地圖操作:

_.chain(filtersPath) 
.filter(function(obj) { 
    return _.find(obj.filters, { id: 5 }); 
}) 
.map(function(obj) { 
    return obj.filters; 
}) 
.value(); 

如果你只想要得到的第一個匹配的對象,你甚至不需要使用過濾器或圖:

_.find(filtersPath, function(obj) { 
    return _.find(obj.filters, { id: 5 }); 
}) 
.filters; 

With lo-dash,這個操作會更容易一些:

_.find(filtersPath, { filters: [{ id: 5 }] }).filters