繁体   English   中英

下划线js-查找嵌套对象

[英]underscore js - finding a nested object

我有一个下划线过滤器,该过滤器返回包含要查找的子对象的父对象。 但是我希望它只返回子对象。 由于它已经在完成查找子对象以返回父对象的工作,因此我想知道如何简化代码以仅返回子对象。 这是示例:

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

因此,在这里,obj.filters内​​部的ID为prefilterCat的嵌套对象是我要返回的对象,而不是其父对象。 因此,目前我必须在filterObject内进行另一次查找才能获得所需的内容。 有任何想法吗?

Underscore的filter方法将返回“父”对象,但将滤除与条件语句不匹配的对象。 在这种情况下,如果只有1个结果,则可以像访问数组一样访问它。 例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM