TypeScript中不依赖Lodash高效比较Order对象数组的方法
Order数组一致性比对实现方案
核心思路
不用手写嵌套循环逐字段比对,也不直接用存在属性序风险的原生JSON.stringify(),通过自定义稳定序列化方法统一对象的序列化规则,配合前置长度校验、索引映射实现高效比对,全程不依赖Lodash等第三方工具库。
具体实现步骤
前置快速拦截
首先比对两个数组的长度,长度不一致直接返回false,避免无意义的后续计算。if (output1.length !== output2.length) return false实现稳定序列化工具,解决原生方法的属性序问题
原生JSON.stringify()会按照对象属性的原始枚举顺序序列化,不同API返回的对象即使属性值完全一致,只要键的定义顺序不同,序列化结果就会出现偏差。
自定义的稳定序列化方法会递归处理所有层级的对象,每一层都先将键按字典序排序后再拼接字符串,保证同值对象无论属性顺序如何,序列化结果完全一致,可覆盖Order结构中嵌套的coupon对象场景:function stableStringify(value: unknown): string { // 处理基础类型、null if (value === null || typeof value !== 'object') { return JSON.stringify(value) } // 处理数组:递归处理每个元素后按序拼接 if (Array.isArray(value)) { return `[${value.map(item => stableStringify(item)).join(',')}]` } // 处理普通对象:按键名字典序排序后递归拼接键值对 const sortedKeys = Object.keys(value).sort() const keyValuePairStr = sortedKeys .map(key => `"${key}":${stableStringify((value as Record<string, unknown>)[key])}`) .join(',') return `{${keyValuePairStr}}` }根据业务场景选择比对逻辑
- 场景1:两个API返回的订单顺序不固定
先将两个数组都转换为以订单id为键的Map,存储每个订单的稳定序列化结果,再逐key比对值是否一致即可,无需嵌套循环:function isOrderArrayEqual(arr1: Order[], arr2: Order[]): boolean { if (arr1.length !== arr2.length) return false const buildOrderMap = (arr: Order[]) => { const orderMap = new Map<number, string>() for (const order of arr) { orderMap.set(order.id, stableStringify(order)) } return orderMap } const map1 = buildOrderMap(arr1) const map2 = buildOrderMap(arr2) for (const [orderId, orderStr] of map1) { if (map2.get(orderId) !== orderStr) return false } return true } - 场景2:两个API返回的订单顺序完全一致
可以直接用单层循环+every方法逐项比对序列化结果,逻辑更简洁:function isOrderArrayEqualWithFixedOrder(arr1: Order[], arr2: Order[]): boolean { if (arr1.length !== arr2.length) return false return arr1.every((order, index) => stableStringify(order) === stableStringify(arr2[index])) }
- 场景1:两个API返回的订单顺序不固定
方案说明
- 给出的Order结构所有字段(数字、布尔值、字符串、嵌套coupon对象)均为可正常序列化的常规类型,不存在JSON序列化会丢失的Symbol、函数、undefined值,适配性有保障
- 没有手写多层嵌套循环逐字段比对逻辑,嵌套结构的一致性校验全部由稳定序列化方法递归完成,代码维护成本低
- 完全规避了原生
JSON.stringify()属性顺序不一致导致的误判问题,且无第三方依赖
内容的提问来源于stack exchange,提问作者Nargis
相关产品推荐
相关产品推荐

