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

对比两个对象数组按Id匹配计算Qty差值,生成新数组及删除订单数组(禁用ES6)

实现方案

你可以直接封装一个独立的处理函数,一次性返回需要的两个结果数组,全程使用ES5语法,没有用到任何ES6特性,代码如下:

function processOrders(oldOrder, newOrder) {
  var oldIdMap = {};
  var newArray = [];
  var droppedOrders = [];
  var i, len, currentId, currentQty;

  // 把老订单的Id、对应数量存入映射表,添加匹配标记
  for (i = 0, len = oldOrder.length; i < len; i++) {
    currentId = oldOrder[i].Id;
    oldIdMap[currentId] = {
      qty: oldOrder[i].Qty,
      matched: false
    };
  }

  // 遍历新订单生成newArray
  for (i = 0, len = newOrder.length; i < len; i++) {
    currentId = newOrder[i].Id;
    currentQty = newOrder[i].Qty;
    if (oldIdMap.hasOwnProperty(currentId)) {
      // 两个订单都存在的Id,Qty取差值
      newArray.push({
        Id: currentId,
        Qty: currentQty - oldIdMap[currentId].qty
      });
      oldIdMap[currentId].matched = true;
    } else {
      // 仅新订单存在的Id,直接加入结果
      newArray.push({
        Id: currentId,
        Qty: currentQty
      });
    }
  }

  // 收集仅在老订单存在的droppedOrders
  for (currentId in oldIdMap) {
    if (oldIdMap.hasOwnProperty(currentId) && !oldIdMap[currentId].matched) {
      droppedOrders.push({
        Id: currentId,
        Qty: oldIdMap[currentId].qty
      });
    }
  }

  // 同时返回两个结果
  return {
    newArray: newArray,
    droppedOrders: droppedOrders
  };
}

调用方式

直接传入两个订单数组即可拿到对应结果,示例如下:

var oldOrder = [{"Id": "10","Qty": 1}, {"Id": "3","Qty": 2}, {"Id": "9","Qty": 2}]; 
var newOrder = [{"Id": "5","Qty": 2},{"Id": "10","Qty": 3}, {"Id": "9","Qty": 1}];

var result = processOrders(oldOrder, newOrder);
var newArray = result.newArray;
var droppedOrders = result.droppedOrders;

说明

  • 采用映射表存储老订单数据,避免了嵌套遍历,运行效率比原生filter嵌套的写法更高
  • 完全基于ES5标准语法实现,兼容所有旧浏览器环境
  • 一次调用即可同时拿到两个需要的结果,无需单独编写额外筛选逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:54:02