如何将规则数组和执行功能与该数组分开



我有一个具有不同验证功能的验证类。现在我要做的是在另一个文件中制作一个对象,并使用构造函数发送所有验证数据。此构造函数将接收一个看起来像"规则[is_empty:value]的对象"。在此左侧部分是函数名称,值是从输入字段获取的值。现在如何称呼该函数并将值发送为参数。当有多个函数有多个参数时,我该怎么办。

我已经尝试使用地图方法和拆分方法,但无法访问该功能。

class Validator {
    constructor(rules) {
        let rule_obj = {}
        // rules[is_empty:value,has_valid_min_length:2;3]
    }
    /**this is to check if the field has an empty value or not */
    is_empty = (value) => {
        if (value == '' || value == null) {
            return true
        }
        else {
            return false
        }
    }
    /**this is to check if value has required minimum length or not */
    has_valid_min_length = (value, min_length = 0) => {
        if (this.is_empty(value)) {
            return false
        }
        if (value.length < min_length) {
            return false
        }
        else {
            return true
        }
    }
    /**this is to check if value has more characters than maximum length */
    has_valid_max_length = (value, max_length = 0) => {
        if (this.is_empty(value)) {
            return false
        }
        if (value.length > max_length) {
            return false
        }
        else {
            return true
        }
    }
    //this is to check if selected date is less than given limit
    is_before_min_date = (value_date, min_date) => {
        if (this.is_empty(value)) {
            return false
        }
        if (value_date < min_date) {
            return true
        }
        else { return false }
    }
    //this is to check if selected date is higher than given limit
    is_after_max_date = (value_date, max_date) => {
        if (this.is_empty(value)) {
            return false
        }
        if (value_date > max_date) {
            return true
        }
        else {
            return false
        }
    }
}

我想调用":"数组中签名之前的函数,并给出该函数参数,该函数在':'。

的右侧具有值。

请帮助。

您可以通过构造函数发送对象...

x = {
      "is_empty": [0, 2, 2],
      "has_valid_min_length": [ [value, min_length], [value, min_length] ],
      "has_valid_max_length": [ [value, max_length], [value, max_length] ],
      "is_before_min_date": [ [value_date, min_date], [value_date, min_date] ],
      "is_after_max_date": [ [value_date, max_date], [value_date, max_date] ]
    }

然后在构造函数中,通过对象设置一个循环和值数组...

constructor(to_be_validated) {
        let validator_names = Object.keys(to_be_validated);
        for (let validator of validator_names) {
            let values = to_be_validated[validator];
            if (validator === "is_empty") {
                for (let value of values) {
                    this.is_empty(value);
                }
            } else if (validator === "has_valid_min_length") {
                for (let value of values) {
                    this.has_valid_min_length(value[0], value[1]);
                }
            } etc...
        }
    }

,然后调用该函数时,方法应执行

let my_validator = new Validator(x);

我回应了上面的评论。想要

的方法和特定语法
let my_validator = new Validator(rules[validator_name:values]);

所有这样的干净线都有点不合时宜。我从未见过那样做。

您可能需要按规则调用所有检查功能的其他功能。

class Validator {
    constructor(rules) {
        this.rules = rules;
        // rules={is_empty:[],has_valid_min_length:[2]};
    }
    validate = (value) => {
        let pass = true;
        Object.keys(this.rules).forEach(k=>pass = pass && this[k](value, ...this.rules[k]));
        return pass;
    }
    ...
}

rules -objects具有键值对,其中键是单个检查的函数名称,值是将通过的参数数组。此数组可以具有零或更多条目。

编辑: forEach将在所有密钥上迭代。每次k都会容纳当前密钥。pass是一个布尔值,可收集您的Checker-intrunctions的所有返回值。(true && false === false(如果任何支票返回false,最终的返回值将是错误的。

然后,您将这些规则应用于这样的数据: myValidatorObj.validate(data);

最新更新