繁体   English   中英

如何使用lodash使用值数组过滤嵌套对象?

[英]How can I filter a nested object with an array of values using lodash?

我有以下数据:

var jobs = [
{
 job_type: "Part Time",
 latitude: 49.545068,
 longitude: 0.760518,
 title: "reiciendis",
 industry: [
  {
    id: 1,
    name: "development" },
  { 
    id: 2,
    name: "design"
  }
 ]},
{
 job_type: "Full Time",
 latitude: 51.545068,
 longitude: 0.460518,
 title: "auteas",
 industry: [
  {
    id: 1,
    name: "development" },
  { 
    id: 2,
    name: "testing"
  }
 ]

并且我想尝试根据用户搜索参数(即选择职位的行业选择)过滤结果,这些参数会填充一个数组:

var jobchoices = ["testing", "design"];

到目前为止,我的lodash过滤器如下所示:

var self = this

return _.filter(this.jobs, function(item) {
    return _.filter(item.industry, function(obj) {
        return _.some(self.jobchoices, obj.name);
    });
});

但对于所有作业,它都返回true。 这是我第一次使用lodash。 我究竟做错了什么? 其次,我是否可以继续以这种方式链接以按另一个用户选择(例如,按工作类型)进行筛选?

您可以将_.filter用作要尝试获取的最终结果的主数组,然后将_.chain与_.map和_.intersection一起使用以过滤内部对象数组。

尽管不是很漂亮,但是类似下面的代码就足够了。

var self = this;

_.filter(jobs, function(job) { 

  return _.chain(job.industry)
    .map('name')
    .intersection(self.jobchoices)
    .size()
    .gt(0)
    .value() 
})

(仅在最新的lodash-v4.16.4中进行了测试)

对于所有作业,它应该返回true,因为示例数据jobs两个jobs都具有匹配的industry项目。 如果将jobchoices数组更改为一个(或多个)项仅与您的一项jobs匹配,则可能看起来像这样(香草JS):

var matches = jobs.filter(function(job) {
  return job.industry.some(function(industry) {
    return jobchoices.indexOf(industry.name) > -1;
  });
});

或等效于ES6:

let matches = jobs.filter(({industry} => industry.some(({name}) => jobchoices.includes(name)));

至于哪里出了问题,顶级_.filter将返回另一个_.filter (它将返回一个数组- 是真实的 -因此将返回所有项目)。 无论内部_.filter调用的长度是否> 0 ,您都应该能够修改原始代码以进行补救:

return _.filter(this.jobs, function(item) {
    var matchingIndustries = _.filter(item.industry, function(obj) {
        return _.some(self.jobchoices, obj.name);
    });
    return matchingIndustries.length > 0;
});

暂无
暂无

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

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