角度过滤嵌套对象:AND vs OR

时间:2015-05-11 10:00:11

标签: angularjs filtering

我正在使用Controller级别的角度过滤,即filterFilter。我需要实现嵌套过滤,我不知道如何以最好的方式做角度。

我有一组看起来如下的对象:

{
  "id": "5d004ff4-46a9-47d5-b068-6b9d581bb6fa",
  "number": 80501703098,
  "firstName": "Loma",
  "lastName": "Collins",
  "age": 44,
  "birthDate": "1980-08-21T12:40:47.026Z",
  "address": {
    "street": "2209 Hirthe Plains",
    "city": "North Heathertown",
    "postCode": "24805"
  },
  "email": {
    "home": "Josefa49@yahoo.com",
    "work": "Phoebe64@sdc.dk"
  },
  "phone": {
    "mobile": "+82 763 681 802",
    "home": "(453) 312 255 267",
    "work": "+45 843 108 216"
  }
}

我还有一个接受几个纯文本输入和控制器代码的表单:

XyzModule.run(['filterFilter', function(filterFilter){
  data = ... // above collection
  params = ... // data from the form
  filtered = filterFilter(data, {
    number: params.number,
    lastName: params.lastName,
    firstName: params.firstName
  });
});
// this has been manually transpiled from .coffee
// don't pay attention if there are errors in the syntax

上面的代码可以通过numberlastNamefirstName成功找到集合对象 - 没关系。

现在我想按emailphone进行搜索。这里的情况是搜索表单接受纯文本字段:phone只是一个字符串以及电子邮件。但是集合中的对象具有嵌套电话和嵌套电子邮件值。

我想实现过滤数据,当params.email是email.home或email.work 时,匹配对象。类似地,当params.phone phone.mobile phone.home OR home.work时。 params是搜索表单输入值的映射。

我尝试过类似的事情:

  filtered = filterFilter(data, {
    phone: params.phone,
    email: params.email
  });

但它不起作用,可能是格式无效。

  filtered = filterFilter(data, {
    phone: {
      home: params.phone,
      mobile: params.phone,
      work: params.phone
    },
    email: {
      home: params.email,
      work: params.email
    }
  });

也不起作用,因为它应用 AND 而不是 OR ,并且不可能为不同的手机或不同的电子邮件设置相同的值。

1 个答案:

答案 0 :(得分:1)

您可以使用$通配符:

filtered = filterFilter(data, {
  phone: {
    $: params.phone
  },
  email: {
    $: params.email
  }
});