Javascript 在if语句中循环变量条件
我在一个表中存储了很多条件语句,每个条件语句都有一些非常不同的格式(Javascript 在if语句中循环变量条件,javascript,loops,variables,if-statement,Javascript,Loops,Variables,If Statement,我在一个表中存储了很多条件语句,每个条件语句都有一些非常不同的格式(如果x>Y,如果Z=true,如果Z,您可以使用 函数检查事件(){ eventConditionLength=Object.keys(eTable).length; for(设i=0;iy”,而是像存储eTable['someCondition]=()=>x>y那样存储它,然后您可以通过if(eTable[i].condition(){/*handle true*/}或者{/*handle false*/}简单地调用它 错误的
如果x>Y
,如果Z=true
,如果Z,您可以使用
函数检查事件(){
eventConditionLength=Object.keys(eTable).length;
for(设i=0;i
正如Vasan在评论中指出的那样,有一个问题需要注意。正如您可能知道的那样,在编写代码时,它将始终有效(只要条件不是空字符串),因为任何非空字符串都是真实的
最好和最安全的方法是编写某种解析器,通过清晰地分解和分析条件来分析条件。这些解析器通常类似于:
const条件='x case'我相信您将字符串传递给if条件语句,因为eTable[I]。条件
它不是逻辑条件,它只是字符串(我相信您有字符串)。您需要使用以下方法将字符串作为代码进行计算:
for(设i=0;i
附言:eval()是一种糟糕的代码风格,而且很危险。请小心。我可以为您的问题提供两种解决方案
更好的方法是存储函数。例如,每个函数都会保存您的条件,而不是存储eTable['someCondition]=“x>y”
,而是像存储eTable['someCondition]=()=>x>y
那样存储它,然后您可以通过if(eTable[i].condition(){/*handle true*/}或者{/*handle false*/}
简单地调用它
错误的方法是,使用eval()并存储表示要执行的js代码的字符串
我认为第一个建议可以实现你的目标。为什么不使用一个对象数组而不是一个对象对象的对象?cEvent
、stat1
和completed
从何而来?除了completed
之外,我不知道你的条件与每个对象有什么关系。正在比较的变量在哪里它们位于每个对象的外部?如果是这样,您似乎可以存储调用函数
构造函数所需的所有数据(参数名称和函数体),然后创建函数并传递数据。如果没有更多信息,很难判断……如果这不是需要序列化的数据,那么您根本不需要字符串,只需创建函数即可。但是,在建议合理的解决方案之前,需要更多信息。我不想在不尽可能努力的情况下继续为了避免像您这样为条件存储字符串。我现在有十几个JS文件。这里只包括与问题相关的部分。也就是说,如果您好奇的话,它通常是一个简单的RPG maker工具,具有简化的UI布局。这意味着我的大多数表都包含UI信息。此特定选项卡le正在生成一个事件模式,该模式会随着您的决策而动态变化。我正在处理的触发器将在何时/何地显示该模式,以及何时不显示该模式。在一般级别上,这些表格尽可能以文字形式组织,以便知识有限的人可以阅读。是的,但也请参见:@Vasan Good call,当然要注意一些注意事项。我会补充我的答案,谢谢。谢谢,感谢你的帮助。对于这个项目,重要的是要认识到它主要是我的学习工具,可能是一个玩具。它不存储敏感数据,也不特别大。在这一点上,我认为eval()我会做的,但是我已经在我的列表上标记了这一点,以便在需要的时候重新评估一个更大的解决方案。考虑到这件事只完成了一半,并且丢失了很多连接,我想我现在将继续。
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'
}
};
function checkEvents () {
eventConditionLength = Object.keys(eTable).length;
for (let i = 0; i < eventConditionLength; i++) {
if (eval(eTable[i].condition))
{
alert(i);
};
};
};
for (let i = 0; i < eventConditionLength; i++) {
if (eval(eTable[i].condition)) {
alert(i);
};
};