是否有一个简单的Javascript库或脚本来处理简单的逻辑测试?
我的任务是根据完成任务的先决条件,在我们的网站上做出一些选择 现在,我使用字符串先决条件存储对象。例如:是否有一个简单的Javascript库或脚本来处理简单的逻辑测试?,javascript,parsing,logic,Javascript,Parsing,Logic,我的任务是根据完成任务的先决条件,在我们的网站上做出一些选择 现在,我使用字符串先决条件存储对象。例如: Task1 = {...}; Task2 = {preq:'Task1', ...} 因此,我可以轻松检查Task2是否仅在Task1完成时可用 问题是任务变得越来越复杂,我需要考虑和/或逻辑。理想情况下,我可以使用如下表达式 Task4 = {prereq:'(Task1&Task2)|Task3}, ...} 如果任务1和2已完成或任务3已完成,则任务4将可用 我真的不确定最
Task1 = {...};
Task2 = {preq:'Task1', ...}
因此,我可以轻松检查Task2是否仅在Task1完成时可用
问题是任务变得越来越复杂,我需要考虑和/或逻辑。理想情况下,我可以使用如下表达式
Task4 = {prereq:'(Task1&Task2)|Task3}, ...}
如果任务1和2已完成或任务3已完成,则任务4将可用
我真的不确定最好的方法是什么。我觉得也许我需要一个解析器或类似的东西,所以我希望有一个解决方案,或者至少是指向正确方向的指针
编辑
现在,我使用的系统与此类似:
我希望能够潜在地使用一系列AND或条件。现在,我只是被要求允许多个足够简单的任务(例如,完成任务1或任务2意味着你现在可以完成任务3)——但我可以看到未来需要更多的变通能力
我希望一切都有意义 对于示例,您可以尝试使用next结构和函数进行检查 如果没有先决条件,则将设置为空
如果有-将设置字符串名称
如果多个带有或-将使用对象
{or:[“task1”、“task2”…]}
如果有多个带and的,则将使用对象
{and:[“task1”、“task2”…]}
也可用于组合-将使用对象,如{和:[{或:[“task1”、“task2”]}、“task3”、{或:[“task5”…}]}
所以示例任务列表可能是这样的
var myObj = {
task1: {name: 'Hello', prereq:null, selected: false},
task2: {name: 'World', prereq:'task1', selected: false},
task3: {name: 'Foo', prereq:{or:["task4","task2"]}, selected: false},
task4: {name: 'Bar', prereq:null, selected: false},
task5: {name: 'Baz', prereq:{and:[{or: ["task4","task6"]},"task1"]}, selected: false},
task6: {name: 'Barrr', prereq:null, selected: false}
};
对于检查,请使用类似的函数
function preq(arr,config){
if(!config) return true;
if(typeof config === "string") return arr[config].selected;
if('or' in config){
for(var i=0,L=config['or'].length;i<L;i++){
if(preq(arr,config['or'][i])) return true;
}
return false;
}
if('and' in config){
for(var i=0,L=config['and'].length;i<L;i++){
if(!preq(arr,config['and'][i])) return false;
}
return true;
}
return false;
}
功能预调(arr,配置){
如果(!config)返回true;
if(typeof config==“string”)返回arr[config]。选中;
if('或'在配置中){
对于(var i=0,L=config['or'].length;i您可以实现一个简单的解析器,将字符串先决条件转换为返回true/false的函数。请检查此项
您可以使用评分系统…每个任务都有一个评分,您必须检查最低评分值。您可以尝试使用一些数据结构,而不是字符串。您希望如何使用它?我已经用jsFidlle更新了我的问题-我希望这更清楚。即使使用对象,我仍然需要确定如何最好地解决和/或con你可以考虑看它是一个有很大灵活性的有限状态机。我敢肯定你可以用它做你想做的事情。这真是太棒了!谢谢!在某些方面看起来很简单。这也很好。但是尤里的简单解析器解决方案在这个例子中似乎更容易实现。ght:-)
var Task = (function() {
//string to function converter
var parse = function(str) {
str = "return " + str.replace(/\|/g, '||')
.replace(/&/g, '&&')
.replace(/(\w+\d+)/g, function($1) {
return 'all["' + $1 + '"].done';
});
return new Function("all", str);
},
returnTrue = function() {
return true;
},
all = {};
/**
* Task constructor
*/
function Task(params) {
this.name = params.name;
//task is available by default
this.prereq = params.prereq ? parse(params.prereq) : returnTrue;
//task is not done.
this.done = false;
//register a task.
Task.all[this.name] = this;
};
/**
* All tasks map storage.
*/
Task.all = all;
/**
* Make a task complete
*/
Task.prototype.complete = function() {
this.done = true;
};
/**
* Make a task incomplete.
*/
Task.prototype.reopen = function() {
this.done = false;
};
/**
* Check if task is available due to prerequsites.
*/
Task.prototype.isAvailable = function() {
return this.prereq(all);
};
return Task;
}());