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

JavaScript中如何高效对比两个对象数组的quantity属性大小?

优化数组匹配校验的效率问题

我有两个对象数组:detail 和 sale.detail,需要校验同一_id对应的元素中,detail数组的quantity属性是否大于sale.detail数组的quantity属性。

示例数组

Array detail

[
  {
    "provider": { "uid": "6271a32082193f4b88e292f0", "name": "Genérico" },
    "_id": "628ff19af062bde6a9fd7a3b",
    "name": "MALBORO ARTESANAL \"20\"",
    "quantity": 6,
    "subtotal": 3156,
    "total": 0,
    "quantityOnBd": 6
  },
  {
    "provider": { "uid": "6271a32082193f4b88e292f0", "name": "Genérico" },
    "_id": "628fef9bf062bde6a9fd7986",
    "name": "MALBORO ROJO \"20\"",
    "quantity": 7,
    "subtotal": 4368,
    "total": 0,
    "quantityOnBd": 7
  }
]

Array sale.detail

[
  {
    "provider": { "uid": "6271a32082193f4b88e292f0", "name": "Genérico" },
    "_id": "628fef9bf062bde6a9fd7986",
    "name": "MALBORO ROJO \"20\"",
    "quantity": 7,
    "subtotal": 4368,
    "total": 0
  },
  {
    "provider": { "uid": "6271a32082193f4b88e292f0", "name": "Genérico" },
    "_id": "628ff19af062bde6a9fd7a3b",
    "name": "MALBORO ARTESANAL \"20\"",
    "quantity": 6,
    "subtotal": 3156,
    "total": 0
  }
]

原实现代码(嵌套循环)

for (let i = 0; i < detail.length; i++) {
    for (let j = 0; j < sale.detail.length; j++) {
        if (detail[i]['_id'] === sale.detail[j]['_id']) {
            if (detail[i]['quantity'] > sale.detail[j]['quantity']) {
                return res.status(400).json({msg:'No puedes regresar mas de la cantidad original'});
            }
        }
    }
}

高效优化方案

方案1:使用普通对象构建映射表

通过将sale.detail转换为以_id为键、quantity为值的对象,把嵌套循环的O(n*m)时间复杂度降低到O(n+m)的线性复杂度:

// 构建sale.detail的id-quantity映射
const saleQuantityMap = {};
for (const item of sale.detail) {
  saleQuantityMap[item._id] = item.quantity;
}

// 遍历detail数组完成校验
for (const item of detail) {
  const saleQuantity = saleQuantityMap[item._id];
  // 可根据业务需求处理_id不存在的情况,比如返回错误或跳过
  if (saleQuantity !== undefined && item.quantity > saleQuantity) {
    return res.status(400).json({msg:'No puedes regresar mas de la cantidad original'});
  }
}

方案2:使用ES6 Map构建映射

如果需要处理更复杂的键类型(比如非字符串),ES6的Map会更合适,用法和普通对象类似:

// 构建sale.detail的id-quantity映射
const saleQuantityMap = new Map();
for (const item of sale.detail) {
  saleQuantityMap.set(item._id, item.quantity);
}

// 遍历detail数组完成校验
for (const item of detail) {
  const saleQuantity = saleQuantityMap.get(item._id);
  if (saleQuantity !== undefined && item.quantity > saleQuantity) {
    return res.status(400).json({msg:'No puedes regresar mas de la cantidad original'});
  }
}

效率说明

原嵌套循环的时间复杂度是O(n*m),当两个数组的元素数量较大时,性能会急剧下降;优化后的方案通过一次遍历构建映射、一次遍历校验,总时间复杂度为O(n+m),在数据量越大的场景下,性能提升越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:15:38