gpt4 book ai didi

javascript - 在 if 语句中循环变量条件

转载 作者:行者123 更新时间:2023-11-30 11:24:50 24 4
gpt4 key购买 nike

我在一个表中存储了很多条件语句,每个条件语句都有一些截然不同的格式( if x > Yif Z = trueif Z <= 12 等)。我以这样一种方式存储它们,以便我可以轻松地遍历条件语句并执行一个函数来更新相关属性。

但是,正如我发现的那样,它不允许我将条件语句存储为变量。这意味着,我必须显式声明每个条件语句,而不是声明一次并遍历所有可能的条件。

有没有办法做到这一点我想念,或者根本不理解?

在下面的例子中,我想使用 eTable[i].condition遍历存储在该位置的所有条件。这有可能吗?

function checkEvents () {
eventConditionLength = Object.keys(eTable).length;

for (let i = 0; i < eventConditionLength; i++) {
if (eTable[i].condition) {
alert(i);
};
};
};

电子表格

var eTable = {
0: {
sceneTitle: '', //Descriptive/organizational only
sceneHeader: ['Event 1', 'Event 1', 'Event 1'],
sceneImage: ['/images/1.jpg', '/images/2.jpg', '/images/3.jpg'],
sceneText: ['Test Scene Text 1', 'Test Scene Text 1', 'Test Scene Text 1'],
sceneControls: ['myFunction1', 'myFunction2', 'myFunction3'],
visible: false,
completed: false,
condition: 'cEvent == "e0002"'
},
1: {
sceneTitle: '', //Descriptive/organizational only
sceneHeader: ['Event 1', 'Event 1', 'Event 1'],
sceneImage: ['/images/1.jpg', '/images/2.jpg', '/images/3.jpg'],
sceneText: ['Test Scene Text 1', 'Test Scene Text 1', 'Test Scene Text 1'],
sceneControls: ['myFunction1', 'myFunction2', 'myFunction3'],
visible: false,
completed: false,
condition: 'stat1 > 15 && completed == false'
}
};

最佳答案

您可能知道,正如您编写的代码一样,它始终有效(只要条件不是空字符串),因为任何非空字符串始终为真。

最好和最安全的方法是编写某种解析器,它会通过彻底分解并分析条件来分析条件。这些通常看起来像:

const condition = 'x < y';

/**
* condition is the full string
* a is the left-hand variable, if needed
* b is the right-hand variable, if needed
*/
function resolve(condition, a, b) {
// regex will get the non-alphanumeric operator and the left and right operands
const [, left, operator, right] = condition.match(/([a-z0-9]+)\s*([^a-z0-9\s]+)\s*([a-z0-9]+)/);

// you'd need a case for each vald operator
switch (operator) {
case '<':
return a < b;
}
}

console.log(resolve(condition, 3, 5));
console.log(resolve(condition, 5, 3));

显然,这是一个简单的示例,但基本过程是相同的。可能还有图书馆可以为您处理。

然后您可以根据需要使用它:

if (resolve('a > b', a, b)) {
// do something
}

您还需要一些逻辑来查看操作数是否为数字,如果是,则使用这些值而不是传入的变量。

我不愿提供的另一个选项是使用 eval() 函数。这个函数通常是一个非常大、 super 糟糕的禁忌,因为它执行任意代码并且可以打开各种安全和逻辑漏洞。但是,对于可能适合的场景(例如供个人使用的非常小、快速的 Node.js 脚本),值得讨论。

const x = 3;
const y = 5;

if (eval('x < y')) {
console.log('condition hit');
}

这将起作用,在您的示例中,只需将您的 eTable[i].condition 包装在 eval 中(并确保它正在寻找的变量已在当前范围内声明)。

不过,这通常非常不好用,所以如果您使用它,请务必在继续使用之前阅读所有相关内容。

关于javascript - 在 if 语句中循环变量条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48410396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com