代码之家  ›  专栏  ›  技术社区  ›  Fabio K

使用字符串条件过滤对象列表?

  •  0
  • Fabio K  · 技术社区  · 6 年前

    我有这个对象结构:

    var objList = [
        { "age": 19, "valueField": 34, "booleanField": false },
        { "age": 15, "valueField": 5,  "booleanField": false },
        { "age": 22, "valueField": 17, "booleanField": true }
    ];
    

    这种情况

    var condition = 'age > 18 && age < 30 && booleanField == true';
    

    我知道我可以用一个简单的过滤函数

    var newObjList = objList.filter(function(obj) {
        return obj.age > 18 && obj.age < 30 && obj.booleanField == true;
    });
    

    但我想使用条件“原样”,而不必在每个字段之前连接“obj”。像这样的东西

    objList.filter(function(obj) {
        return conditon; // all the fields referenced in the condition should point to the corresponding obj fields
    })
    

    这可以看作是一个SQL查询

    SELECT * 
    FROM objlist
    where " + condition + ";
    

    能做到吗?

    2 回复  |  直到 6 年前
        1
  •  -1
  •   ibrahim mahrir    6 年前

    注:

    我从这张便条开始提到问题的解决方案使用两种方法 with eval 应谨慎使用(仅当您 保证 condition 字符串不包含 恶意代码 )

    解决方案:

    你可以使用 埃瓦 具有 要做到这一点:

    var newObjList = objList.filter(function(obj) {
        return eval("with(obj) {" + condition + "}");
    });
    

    例子:

    var objList = [ { "age": 19, "valueField": 34, "booleanField": false }, { "age": 15, "valueField": 5,  "booleanField": false }, { "age": 22, "valueField": 17, "booleanField": true } ];
    var condition = 'age > 18 && age < 30 && booleanField == true';
    
    var newObjList = objList.filter(function(obj) {
        return eval("with(obj) {" + condition + "}");
    });
    
    console.log(newObjList);
        2
  •  1
  •   Nina Scholz    6 年前

    可以替换中对象的所有已知键 condition 使用对象后缀并生成一个新函数作为带有替换条件和返回语句的回调。

    也许您需要挂载替换键,以防止替换不需要的子字符串。

    var array = [{ age: 19, valueField: 34, booleanField: false }, { age: 15, valueField: 5, booleanField: false }, { age: 22, valueField: 17, booleanField: true }];
        condition = 'age > 18 && age < 30 && booleanField == true',
        cb = new Function('o', 'return ' + condition.replace(new RegExp(Object.keys(array[0]).join('|'), 'g'), 'o.$&'));
    
    console.log(array.filter(cb));