我有这个对象结构:
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 + ";
可以做到吗?
答案 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)
注意:
我从本笔记开始要提到,解决问题的方法同时使用eval
和condition
,应格外小心(只有在您得到保证时才能使用 eval
字符串将不包含恶意代码)。
解决方案:
您可以使用with
和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);
示例:
javaScript