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

时间:2018-08-21 11:47:00

标签: javascript filter implicit

我有这个对象结构:

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 个答案:

答案 0 :(得分:1)

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

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

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));

答案 1 :(得分:-1)

注意:

我从本笔记开始要提到,解决问题的方法同时使用evalcondition,应格外小心(只有在您得到保证时才能使用 eval字符串将不包含恶意代码)。

解决方案:

您可以使用withvar 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);

示例:

javaScript