2628. 完全相等的 JSON 字符串
2023年11月26日大约 2 分钟
2628. 完全相等的 JSON 字符串
type JSONValue =
| null
| boolean
| number
| string
| JSONValue[]
| { [key: string]: JSONValue }
function areDeeplyEqual(o1: JSONValue, o2: JSONValue): boolean {
if (o1 === o2) return true
if (o1 === null || o2 === null) return false
if (typeof o1 !== typeof o2) return false
if (Array.isArray(o1) !== Array.isArray(o2)) return false
if (Array.isArray(o1)) {
if (!Array.isArray(o2)) return false
if (o1.length !== o2.length) return false
for (let i = 0; i < o1.length; i++) {
if (!areDeeplyEqual(o1[i], o2[i])) return false
}
return true
}
if (typeof o1 === 'object' && typeof o2 === 'object') {
const keys1 = Object.keys(o1)
const keys2 = Object.keys(o2)
if (keys1.length !== keys2.length) return false
for (const key of keys1) {
if (!(key in o2)) return false
if (!areDeeplyEqual(o1[key], o2[key])) return false
}
return true
}
return false
}题目要点
「2628. 完全相等的 JSON 字符串」本质是对象结构变换问题,核心在于键空间规则、覆盖策略与深浅层处理边界。
思路拆解
- 先定义输入输出契约:哪些字段保留、哪些字段合并、冲突时谁覆盖。
- 区分基本类型、数组、普通对象,避免把不同语义混到同一分支。
- 在递归或遍历中保持结果对象的构造顺序与可预测性。
复杂度分析
- 时间复杂度:与节点总数/键总数成正相关;递归方案还要考虑层级深度。
- 空间复杂度:主要来自结果对象、递归栈与中间映射结构。
边界与测试
null、空对象、空数组、缺失字段。- 同名键冲突、嵌套层级不一致、类型不一致。
- 引用类型是否需要复制、冻结或保持原引用。
工程实践
把“冲突处理规则”写成独立函数(如 merge/resolve),比散落在分支里的临时判断更利于维护。
总结
对象题的稳定做法是先定数据契约,再写转换流程;契约清晰后,代码复杂度和错误率都会显著下降。
