Java Script: How to store a condition in a String and pass it inside IF condition block?

Viewed 119

In JavaScript is this the correct way to store a condition in a string and pass it inside the IF condition block?

I am doing it for the dynamic filter. For example, sometimes, it applies gender or location or at a time both. I want it to dynamic if there are many filters then I have to apply many conditions manually.

var condition = `element.gender == "Male"`,
conditon2 = `element.gender == "Male" && element.location == "Mumbai"` ;

var person = [
  { name: "Rahul", age: 28, gender: "Male", location :"Mumbai" },
  { name: "Dinesh", age: 24, gender: "Male", location :"Delhi" },
  { name: "Sonam", age: 23, gender: "Female", location :"Kolkata" },
  { name: "Jenny", age: 24, gender: "Female", location :"Banglore" },
  { name: "Mitch", age: 27, gender: "Male", location :"Chennai" }
];

var person_filter = person.filter(function (element) {
  if(condition)
    return element;
});

console.log(person_filter);

1 Answers

Using the string in the condition alone will always return true since it exists. There are several ways you can solve such a problem, some of them are:

  • Using eval (usually not recommended):

const condition = `element.gender == "Male"`,
condition2 = `element.gender == "Male" && element.location == "Mumbai"`;
const person = [
  { name: "Rahul", age: 28, gender: "Male", location :"Mumbai" },
  { name: "Dinesh", age: 24, gender: "Male", location :"Delhi" },
  { name: "Sonam", age: 23, gender: "Female", location :"Kolkata" },
  { name: "Jenny", age: 24, gender: "Female", location :"Banglore" },
  { name: "Mitch", age: 27, gender: "Male", location :"Chennai" }
];

const males = person.filter(element => eval(condition));
console.log('males', males);

const malesFromMumbai = person.filter(element => eval(condition2));
console.log('malesFromMumbai', malesFromMumbai);

  • Use JSON to represent your condition:

const condition = { gender: "Male" },
condition2 = { gender: "Male", location: "Mumbai" };
const person = [
  { name: "Rahul", age: 28, gender: "Male", location :"Mumbai" },
  { name: "Dinesh", age: 24, gender: "Male", location :"Delhi" },
  { name: "Sonam", age: 23, gender: "Female", location :"Kolkata" },
  { name: "Jenny", age: 24, gender: "Female", location :"Banglore" },
  { name: "Mitch", age: 27, gender: "Male", location :"Chennai" }
];

const males = person.filter(element =>
  Object.entries(condition).every(([key,val]) => element[key] === val)
);
console.log('males', males);

const malesFromMumbai = person.filter(element =>
  Object.entries(condition2).every(([key,val]) => element[key] === val)
);
console.log('malesFromMumbai', malesFromMumbai);

  • Creating a helper function (more dynamic):

const conditions = (rule, params = {}) => {
  let res = false;
  switch(rule) {
    case 'males':
      res = (params.gender === "Male");
      break;
    case 'malesFromMumbai': 
      res = (params.gender === "Male" && params.location === "Mumbai");
      break;
    default:
      console.log('Rule Not Found');
  }
  return res;
}

const person = [
  { name: "Rahul", age: 28, gender: "Male", location :"Mumbai" },
  { name: "Dinesh", age: 24, gender: "Male", location :"Delhi" },
  { name: "Sonam", age: 23, gender: "Female", location :"Kolkata" },
  { name: "Jenny", age: 24, gender: "Female", location :"Banglore" },
  { name: "Mitch", age: 27, gender: "Male", location :"Chennai" }
];

const males = person.filter(element =>
  conditions('males', { gender: element.gender })
);
console.log('males', males);

const malesFromMumbai = person.filter(element =>
  conditions('malesFromMumbai', { gender: element.gender, location: element.location })
);
console.log('malesFromMumbai', malesFromMumbai);

Related