ramu mothukuri
ramu mothukuri

Reputation: 83

Unable to filter multiple fields using filter

In Array I used name filter on the (name,desc). and I used flag. I tried using name I applied filter for name or desc and flag. but I am not getting two records. I tried to filter name for (name,desc) and flag. Below is my code

var data = [
  {
    name: "hello",
    domain: "domain1",
    subdomain: "subdomain1",
    type: "yes"
  },
  {
    name: "hello",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
     desc: null,
      flag:null
  },
  {
    name: "helloo",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
    desc: "test",
    flag:"yes"
  },
  {
    name: "test1",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
    desc: "hello",
    flag:"yes"
  }
];

var name = "he";
var flag = "yes";
var res = data.filter((d)=>{return ( (name.length &&  d.name) ? d.name.toLowerCase().indexOf(name.toLowerCase()) > -1: "" || (name.length &&  d.desc) ? d.desc.toLowerCase().indexOf(name.toLowerCase()) > -1: "") && (flag.length && d.flag)
    ? d.flag.includes(flag)
    : ""});

console.log(JSON.stringify(res));

name value I tried to filter (name , desc) and flag. but getting name and flag, unable to get desc having the text "he" I need to get two records actually { name: "helloo", domain: "domain2", subdomain: "subdomain6", type: "no", desc: "test", flag:"yes" }, { name: "test1", domain: "domain2", subdomain: "subdomain6", type: "no", desc: "hello", flag:"yes" }

Upvotes: 2

Views: 50

Answers (2)

K K
K K

Reputation: 18109

This should serve the purpose. Club the relevant conditions:

var data = [{
    name: "hello",
    domain: "domain1",
    subdomain: "subdomain1",
    type: "yes"
  },
  {
    name: "hello",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
    desc: null,
    flag: null
  },
  {
    name: "helloo",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
    desc: "test",
    flag: "yes"
  },
  {
    name: "test1",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
    desc: "hello",
    flag: "yes"
  }
];

var name = "he";
var flag = "yes";
var res = data.filter((d) => {
  return d.name && d.desc && d.flag && (d.name.toLowerCase().indexOf(name.toLowerCase()) > -1 || d.desc.toLowerCase().indexOf(name.toLowerCase()) > -1 && d.flag.includes(flag))
});

console.log(JSON.stringify(res));

Upvotes: 0

Mosè Raguzzini
Mosè Raguzzini

Reputation: 15851

Sa name && description are always present, you are making useless checks. Check out below if it is the result you are looking for:

var data = [
  {
    name: "hello",
    domain: "domain1",
    subdomain: "subdomain1",
    type: "yes"
  },
  {
    name: "hello",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
     desc: null,
      flag:null
  },
  {
    name: "helloo",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
    desc: "test",
    flag:"yes"
  },
  {
    name: "test1",
    domain: "domain2",
    subdomain: "subdomain6",
    type: "no",
    desc: "hello",
    flag:"yes"
  }
];

var name = "he";
var flag = "yes";
var res = data.filter(d => d.name.indexOf('he') > -1 ||  d.flag === 'yes');

console.log(JSON.stringify(res.length));
console.log(JSON.stringify(res));

Upvotes: 2

Related Questions