我有一个下划线过滤器,它返回包含我正在寻找的子对象的父对象。但我希望它只返回子对象。由于它已经在定位子对象以返回父对象,我想知道如何简化我的代码以仅返回子对象。这是一个例子:
var filterObj = _.filter(filtersPath, function(obj) {
return _.where(obj.filters, {id: prefilterCat}).length > 0;
});
所以在这里,obf.filters中的嵌套对象,其id为prefilterCat,是我想要返回的对象,而不是它的父对象。所以目前我必须在filterObject内部进行另一次查找以获得我需要的东西。有什么想法吗?
答案 0 :(得分:1)
下划线filter
方法将返回"父母"对象但会筛选出与条件语句不匹配的对象。在这种情况下,如果只有1个结果,那么您可以像访问数组一样访问它。例如:
var filterObj = _.filter(filtersPath, function(obj) {
return _.where(obj.filters, {id: prefilterCat}).length > 0;
})[0];
上面的例子将获得从filter方法返回的第一个子节点。
答案 1 :(得分: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