JavaScript 中的动态 if 条件
Dynamic if conditions in JavaScript
是否可以在不使用影响其性能的 eval() 或 new function() 的情况下动态传递 if 语句的条件及其运算符。
<script>
var Students = [{
"name": "Raj",
"Age":"15",
"RollNumber": "123",
"Marks": "99",
}, {
"name": "Aman",
"Age":"14",
"RollNumber": "223",
"Marks": "69",
},
{
"name": "Vivek",
"Age":"13",
"RollNumber": "253",
"Marks": "89",
}
];
*Number of condition are dynamic. can even contain 3 or 4 condition at a time*
var condition = [{"attribute":"el.Age","operator":">=","value":14},
{"attribute":"el.Marks","operator":"<=","value":70}];
var newArray =Students.filter(function (el)
{
if( condition[0].attribute condition[0].operator condition[0].value && condition[1].attribute condition[1].operator condition[1].value ){
return true;
});
console.log(newArray);
</script>
是的,您将操作数和运算符传递给一个函数,该函数根据运算符分派给执行操作的对象。
作为代码草图:
const operators = new Map([
["<", lt],
[">", gt],
["<=", lte],
[">=", gte],
// ...
]);
function evaluate(operator, leftOperand, rightOperand) {
const evaluator = operators.get(operator);
if (!evaluator) {
throw new Error(`Unknown operator ${operator}`);
}
return evaluator(leftOperand, rightOperand);
}
...其中lt
、gt
等是执行操作的函数。我在上面使用了 operator
、leftOperand
和 rightOperand
,但如果您愿意,可以使用 attribute
和 value
。您需要 like this 来获取“属性”的值(JavaScript 项是“属性”)。
(或者你可以在 evaluate
函数本身的大 switch
中进行操作。)
然后你在 filter
:
中使用那个函数
let newArray = Students.filter(student => conditions.every(({operator, attribute, value}) => {
const leftOperand = getProperty(student, attribute);
return evaluate(operator, leftOperand, value);
}));
我在那里使用了 every
,因为您使用的是 &&
条件。 (请注意,我将 condition
数组重命名为 conditions
,因为数组包含多个值。)
是否可以在不使用影响其性能的 eval() 或 new function() 的情况下动态传递 if 语句的条件及其运算符。
<script>
var Students = [{
"name": "Raj",
"Age":"15",
"RollNumber": "123",
"Marks": "99",
}, {
"name": "Aman",
"Age":"14",
"RollNumber": "223",
"Marks": "69",
},
{
"name": "Vivek",
"Age":"13",
"RollNumber": "253",
"Marks": "89",
}
];
*Number of condition are dynamic. can even contain 3 or 4 condition at a time*
var condition = [{"attribute":"el.Age","operator":">=","value":14},
{"attribute":"el.Marks","operator":"<=","value":70}];
var newArray =Students.filter(function (el)
{
if( condition[0].attribute condition[0].operator condition[0].value && condition[1].attribute condition[1].operator condition[1].value ){
return true;
});
console.log(newArray);
</script>
是的,您将操作数和运算符传递给一个函数,该函数根据运算符分派给执行操作的对象。
作为代码草图:
const operators = new Map([
["<", lt],
[">", gt],
["<=", lte],
[">=", gte],
// ...
]);
function evaluate(operator, leftOperand, rightOperand) {
const evaluator = operators.get(operator);
if (!evaluator) {
throw new Error(`Unknown operator ${operator}`);
}
return evaluator(leftOperand, rightOperand);
}
...其中lt
、gt
等是执行操作的函数。我在上面使用了 operator
、leftOperand
和 rightOperand
,但如果您愿意,可以使用 attribute
和 value
。您需要 like this 来获取“属性”的值(JavaScript 项是“属性”)。
(或者你可以在 evaluate
函数本身的大 switch
中进行操作。)
然后你在 filter
:
let newArray = Students.filter(student => conditions.every(({operator, attribute, value}) => {
const leftOperand = getProperty(student, attribute);
return evaluate(operator, leftOperand, value);
}));
我在那里使用了 every
,因为您使用的是 &&
条件。 (请注意,我将 condition
数组重命名为 conditions
,因为数组包含多个值。)