是否有一个简单的Javascript库或脚本来处理简单的逻辑测试
Is there a simple Javascript library or script to handle simple logic tests?
我的任务是根据完成任务的先决条件,在我们的网站上制作一些选项。
现在,我使用字符串先决条件存储对象。例如:
Task1 = {...};
Task2 = {preq:'Task1', ...}
因此,我可以很容易地检查Task2是否只有在Task1完成时才可用。
问题是任务变得越来越复杂,我需要考虑"与/或"逻辑。理想情况下,我可以使用这样的表达式
Task4 = {prereq:'(Task1&Task2)|Task3}, ...}
如果任务1和2已经完成或者任务3已经完成,则这将使任务4可用。
我真的不确定该怎么办。我觉得也许我需要一个解析器或类似的东西,所以我会很感激一个解决方案,或者至少是指向正确方向的指针。
编辑
现在,我使用的系统与此类似:http://jsfiddle.net/jEzaz/
我希望能够潜在地使用一系列AND和OR条件。现在,我只是被要求允许多个足够简单的任务(例如,完成任务1或任务2意味着你现在可以完成任务3),但我可以看到未来需要更多的灵活性。
我希望这一切都有意义!
对于一个样本,您可以尝试使用下一个结构和函数来检查
如果没有先决条件,则设置为null
如果有-将设置字符串名称
如果几个带有或-的将使用对象{or: ["task1","task2"...]}
如果几个具有和-将使用对象{and: ["task1","task2"...]}
也用于联合收割机-将使用类似{and: [{or:["task1","task2"]},"task3",{or:{"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;
}
您还可以在JSFiiddle 上检查工作中的样本
您可以实现一个简单的解析器,将字符串先决条件转换为返回true/false的函数。检查这把小提琴http://jsfiddle.net/tarabyte/a9F6Z/
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;
}());
- 简单的javascript在Shopify中不起作用
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 如何制作简单的php'在Javascript中的foreach等价物
- JQuery:向多个匹配结果添加换行符的最简单方法
- AJAX简单错误.XMLHttpRequest无法加载http://localhost/mpl/getPage.php.
- Moment/Jquery-一个简单时间线的愚蠢问题
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 简单类测试未通过
- 简单地将拆分变量添加到对象中
- 通过javascript操作图像,非常简单
- 问题用moment JS制作一个简单的时间表
- 简单的ES6承诺问题-交换解决和拒绝参数
- 带有计数器、缩略图、进度条和淡入淡出效果的简单jQuery幻灯片
- 简单的JS函数.需要对变量进行澄清
- 简单的交换程序无法使用javascript
- 如何只使用特定的表行构建简单的手风琴
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- react路由器使用简单的javascript路由器配置来处理不匹配的路径
- 简单的JavaScript方法链接
- sencha touch:5个简单的问题