2014-11-06 48 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