【问题标题】:How can I filter a nested object with an array of values using lodash?如何使用 lodash 过滤具有值数组的嵌套对象?
【发布时间】:2017-02-19 10:38:48
【问题描述】:

我有以下数据:

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。我究竟做错了什么?其次,我是否可以继续以这种方式进行链接以按其他用户选择(例如按工作类型)进行过滤?

【问题讨论】:

  • developmenttestingdesign 不应该是字符串吗?
  • 你是对的。已更新。

标签: javascript arrays filtering lodash


【解决方案1】:

您可以将 _.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 测试)

【讨论】:

    【解决方案2】:

    应该为所有作业返回 true,因为您的示例数据 jobs 中的两个作业都有匹配的 industry 项。如果您将 jobchoices 数组更改为仅与您的 jobs 中的一个匹配的项目(或多个项目),则可能看起来像这样(vanilla 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;
    });
    

    【讨论】:

    • 谢谢。我应该澄清一下,jobs 数组是一个示例,还有其他不同行业的职位条目。
    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2016-03-23
    • 2019-02-11
    • 2017-09-01
    • 2019-05-22
    • 2021-11-21
    相关资源
    最近更新 更多