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

TypeScript中不依赖Lodash高效比较Order对象数组的方法

Order数组一致性比对实现方案

核心思路

不用手写嵌套循环逐字段比对,也不直接用存在属性序风险的原生JSON.stringify(),通过自定义稳定序列化方法统一对象的序列化规则,配合前置长度校验、索引映射实现高效比对,全程不依赖Lodash等第三方工具库。


具体实现步骤

  1. 前置快速拦截
    首先比对两个数组的长度,长度不一致直接返回false,避免无意义的后续计算。

    if (output1.length !== output2.length) return false
    
  2. 实现稳定序列化工具,解决原生方法的属性序问题
    原生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}}`
    }
    
  3. 根据业务场景选择比对逻辑

    • 场景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]))
      }
      

方案说明

  • 给出的Order结构所有字段(数字、布尔值、字符串、嵌套coupon对象)均为可正常序列化的常规类型,不存在JSON序列化会丢失的Symbol、函数、undefined值,适配性有保障
  • 没有手写多层嵌套循环逐字段比对逻辑,嵌套结构的一致性校验全部由稳定序列化方法递归完成,代码维护成本低
  • 完全规避了原生JSON.stringify()属性顺序不一致导致的误判问题,且无第三方依赖

内容的提问来源于stack exchange,提问作者Nargis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:46:03