是否有一个简单的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;
}());