underline-js-查找嵌套对象

underscore js - finding a nested object

本文关键字:对象 嵌套 查找 underline-js-      更新时间:2023-09-26

我有一个下划线过滤器,它返回包含我要查找的子对象的父对象。但我希望它只返回子对象。由于它已经在定位子对象以返回父对象,我想知道如何简化代码以只返回子对象。下面是一个例子:

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

因此,在这里,obj.filter中的嵌套对象,id为prefilterCat,是我想要返回的对象,而不是它的父对象。因此,目前我必须在filterObject中进行另一次查找才能获得所需内容。有什么想法吗?

Undercore的filter方法将返回"parent"对象,但将过滤掉与条件语句不匹配的对象。在这种情况下,如果只有一个结果,那么您可以像访问数组一样访问它。例如:

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

上面的示例将获得从filter方法返回的第一个子项。

根据您的问题和代码,我假设数据结构如下:

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;

有了lo-dash,这个操作会简单一点:

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