Javascript动态条件

Javascript动态条件,javascript,Javascript,我想构建一个IF条件,它是基于它得到的参数动态构建的。除此之外,这将作为一个插件构建。 例如,学生对象有3个参数,称为年龄、姓名、电话号码。此外,还有一个用于选择参数的选项对象。 在这种情况下, if(student.age >option.age & student.name == option.name & student.phonenumbers == option.phonenumbers ){ // do stuff } 如果缺少任何参数,则不应将其包括在条

我想构建一个
IF
条件,它是基于它得到的参数动态构建的。除此之外,这将作为一个插件构建。
例如,学生对象有3个参数,称为年龄、姓名、电话号码。此外,还有一个用于选择参数的选项对象。
在这种情况下,

if(student.age >option.age  & student.name == option.name & student.phonenumbers == option.phonenumbers ){
// do stuff 
}
如果缺少任何参数,则不应将其包括在条件中。例如,假设在option.name未定义的情况下,if条件应准备如下:

if(student.age >option.age & student.phonenumbers == option.phonenumbers ){
    // do stuff 
    }  

此外,为什么需要这种东西是因为这里迭代了(500个对象)students对象的数组。上面的条件可以分解为单独的条件,但是迭代将乘以条件的数量!!!。因此,我正在寻找一种将所有条件添加到一个中的方法

但是,我的方法是,将表达式创建为字符串,然后使用
eval(…)
执行它,但据我所知,使用
eval
可能会导致漏洞


任何人都可以告诉我一种实现动态条件的方法。

您可以在函数中设置条件,也可以在数组中设置这些函数。因此,您可以在数组中执行循环并调用每个函数(条件)

var aConds=[];
函数firstCond(params){return(params

function testStudent(student,option) {
  var res = [];
  var test = true;
  if (student.age) res.push(student.age > option.age);
  if (student.name) res.push(student.name == option.name);
  if (student.phonenumbers) res.push(student.phonenumbers == option.phonenumbers);
  for (var i=0;i<res.length;i++) {
    test = test && res[i];
  }
  if (res.length > 0 && test) {
    //do stuff
  }
}
函数测试学生(学生,选项){
var-res=[];
var检验=真;
if(student.age)res.push(student.age>option.age);
if(student.name)res.push(student.name==option.name);
if(student.phonenumbers)res.push(student.phonenumbers==option.phonenumbers);
对于(变量i=0;i 0&&test){
//做事
}
}
通用:

function testObjects(obj1,obj2) {

  for (var o in obj1) { // assuming obj2 is a superset of obj1
    if (o === "age" && obj1.age <= obj2.age) return false;
    if (obj1.hasOwnProperty(o) && obj1[o] != obj2[o]) return false;
  }
  return true;
}
var ok = testObjects(student,option);
功能测试对象(obj1、obj2){
对于(obj1中的var o){//假设obj2是obj1的超集
如果(o==“age”&&obj1.age注意JavaScript和运算符是
&&

就您的示例而言,这应该是可行的:

if((!student.age || student.age>option.age) && 
   (!student.name || student.name==option.name) &&
   (!student.phonenumbers || student.phonenumbers==option.phonenumbers)
  ) {
}
在每种情况下允许未定义是否有效

if((student.age == undefined || student.age > option.age) && (student.name == undefined || student.name == option.name) ... 

如果«do stuff»不需要参数,为什么要把它们放在你的条件下?@Joerg。谢谢你的关注。“doStuff”的意思类似于对学生对象的计算或将学生对象添加到数组中。你确定位逻辑可以在这里工作吗?创建一个函数,使用参数和运算符。它甚至可能会确保参数有效后,在内部使用沙盒
eval
。“上述条件可以拆分为单独的条件,但迭代将乘以条件数!!!”…这是同一件事,不是吗?不管你是否分割条件。最后,你需要满足1、2或3个条件,不管你是否分割它们。这是我的想法,但太奇怪了,无法完成,所以我做了很长一段时间。现在我有点高兴我没有速记。见我更新的answerThanks非常感谢。这非常有用,只需稍作修改,它就可以更加解耦,但还有一件事需要知道,假设有100名学生,for循环将执行100次。难道没有解决方案或者必须坚持这个级别吗?我已经使它更通用了。eval可以使第二个循环/reduce更小:
var ok=eval(res.join(&&&);
通用函数很好,您甚至可以排除
res
test
变量。在循环中,执行如下操作:
if(o==='age'&&obj1.age
if((student.age == undefined || student.age > option.age) && (student.name == undefined || student.name == option.name) ...