JavaScript基于自定义Schema校验对象结构的问题排查
请求对象结构校验代码问题排查
你当前的实现存在两个核心错误:
- 对象相等判断逻辑完全错误
JavaScript 中对非原始值(对象、数组等)使用===比较时,判断的是两个变量是否指向同一块内存地址,不会对比对象的内部结构、字段值。哪怕两个独立对象的字段、值完全一模一样,===比较也会返回false。 - 规则对象和实例对象的内容本质不匹配
你定义的OBJECT_SCHEMA中存储的是类型构造函数(String、Number),是用来描述字段类型规则的元数据;而testObj中存储的是实际业务数据(字符串、数字类型的具体值),二者内容维度完全不同,不可能通过相等判断得到匹配结果。
正确实现参考
你需要编写递归遍历逻辑,逐字段对比实际值的类型和schema中声明的规则是否匹配,简单实现如下:
const OBJECT_SCHEMA = { "uuid": { "value": String, "type": String }, "rate": { "value": Number, "type": String } } const testObj = { "uuid": { "value": "5481da7-8b7-22db-d326-b6a0a858ae2f", "type": "id" }, "rate": { "value": 0.12, "type": "percent" } } /** * 递归校验对象结构 * @param {any} target 待校验的目标对象 * @param {object} schema 校验规则 * @returns {boolean} 校验结果 */ function validate(target, schema) { // 基础类型规则校验:如果当前规则是类型构造器,直接判断值类型 if (schema === String || schema === Number || schema === Boolean) { return typeof target === typeof schema() } // 非对象类型直接判定不匹配 if (typeof target !== 'object' || target === null || typeof schema !== 'object') { return false } // 校验字段数量一致,避免缺漏字段 const targetKeys = Object.keys(target) const schemaKeys = Object.keys(schema) if (targetKeys.length !== schemaKeys.length) return false // 逐字段递归校验 for (const key of schemaKeys) { if (!Object.hasOwn(target, key) || !validate(target[key], schema[key])) { return false } } return true } const ok = validate(testObj, OBJECT_SCHEMA) console.log(ok) // 输出 true,符合预期
补充说明
- 上述实现仅覆盖当前场景的嵌套对象、基础类型校验,如果需要支持数组、可选字段、正则匹配、值范围校验等更复杂的规则,可以在这个逻辑基础上扩展规则判断分支。
- 如果是生产环境复杂的API校验场景,直接使用成熟的开源schema校验库即可,不需要从零实现全量规则。
内容的提问来源于stack exchange,提问作者Gustav Vingtoft
相关产品推荐
相关产品推荐

