对比两个对象数组按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
相关产品推荐
相关产品推荐

