是否有一个简单的Javascript库或脚本来处理简单的逻辑测试

Is there a simple Javascript library or script to handle simple logic tests?

本文关键字:简单 本来 处理 逻辑测试 脚本 有一个 Javascript 是否      更新时间:2023-10-30

我的任务是根据完成任务的先决条件,在我们的网站上制作一些选项。

现在,我使用字符串先决条件存储对象。例如:

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;
}());