You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:18:22