JavaScript订单数组noOfSubmit增量方案正确性验证咨询
需求描述
当新的orderId被推送至数组时,需对符合条件的记录的noOfSubmit字段进行增量操作:将orderId按连字符“-”分割后取前缀,仅对数组中orderId包含该前缀的记录的noOfSubmit加1;例如orderId为R1-1时,前缀为R1,仅对orderId含R1的记录增量。推送R2前缀的订单时,不得对R1前缀的记录的noOfSubmit进行增量;推送R3前缀的订单时,不得对R1、R2前缀的记录增量。
输入输出示例
输入数组:
[{"orderId":"R1-1","noOfSubmit":1,"orderNo":"A"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"B"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"C"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"D"}]
推送{"orderId":"R1-2","noOfSubmit":1,"orderNo":"E"}后的预期输出:
[{"orderId":"R1-1","noOfSubmit":2,"orderNo":"A"}, {"orderId":"R1-1","noOfSubmit":2,"orderNo":"B"}, {"orderId":"R1-1","noOfSubmit":2,"orderNo":"C"}, {"orderId":"R1-1","noOfSubmit":2,"orderNo":"D"}, {"orderId":"R1-2","noOfSubmit":1,"orderNo":"E"}]
其余推送场景的输入输出示例略。
实现方案与问题
用户编写了两个JavaScript实现方案:
方案一代码
const orders = [{"orderId":"R1-1","noOfSubmit":1,"orderNo":"A"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"B"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"C"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"D"}]; function add_order(order_array, order) { if (!order_array.some(o => o.orderId == order.orderId) && order_array.some(o =>o.orderId.includes(order.orderId.split("-")[0]))) { order_array.filter(a1 => a1.orderId.includes(order.orderId.split("-")[0])).forEach(o => o.noOfSubmit++); } order_array.push(order); } add_order(orders, {"orderId":"R1-2","noOfSubmit":1, "orderNo":"E"}); add_order(orders, {"orderId":"R1-2","noOfSubmit":1, "orderNo":"F"}); add_order(orders, {"orderId":"R1","noOfSubmit":1, "orderNo":"G"}); add_order(orders, {"orderId":"R1","noOfSubmit":1, "orderNo":"H"}); add_order(orders, {"orderId":"R2","noOfSubmit":1, "orderNo":"H"}); console.log(orders);
用户认为该方案似乎可行,咨询是否符合需求。
方案一的问题分析
这个方案存在多处不符合需求的问题:
- 额外限制了重复orderId的情况:需求中没有要求“推送重复orderId的订单时不增量”,但方案一通过
!order_array.some(o => o.orderId == order.orderId)限制了只有新orderId才执行增量,这与需求不符。比如推送重复的R1-2订单时,按照需求应该对所有R1前缀的记录增量,但方案一此时不会执行增量。 - 前缀匹配逻辑不严谨:使用
includes判断前缀会导致误匹配,比如如果数组中有orderId为R11-1的记录,当推送R1-2时,R11-1会被误判为包含R1前缀,从而错误地执行增量。 - 重复计算冗余:多次调用
order.orderId.split("-")[0],重复计算前缀,影响性能。
方案二代码
const orders = [{"orderId":"R1-1","noOfSubmit":1,"orderNo":"A"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"B"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"C"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"D"}]; function add_order(order_array, order) { if (order_array.filter(a1 => a1.orderId.includes(order.orderId.split("-")[0]))) { order_array.filter(a1 => a1.orderId.includes(order.orderId.split("-")[0])).forEach(o => o.noOfSubmit++); } order_array.push(order); } add_order(orders, {"orderId":"R1-2","noOfSubmit":1, "orderNo":"E"}); add_order(orders, {"orderId":"R1-2","noOfSubmit":1, "orderNo":"F"}); add_order(orders, {"orderId":"R1","noOfSubmit":1, "orderNo":"G"}); add_order(orders, {"orderId":"R1","noOfSubmit":1, "orderNo":"H"}); add_order(orders, {"orderId":"R2","noOfSubmit":1, "orderNo":"H"}); console.log(orders);
输出结果:
[ { orderId: 'R1-1', noOfSubmit: 5, orderNo: 'A' }, { orderId: 'R1-1', noOfSubmit: 5, orderNo: 'B' }, { orderId: 'R1-1', noOfSubmit: 5, orderNo: 'C' }, { orderId: 'R1-1', noOfSubmit: 5, orderNo: 'D' }, { orderId: 'R1-2', noOfSubmit: 4, orderNo: 'E' }, { orderId: 'R1-2', noOfSubmit: 3, orderNo: 'F' }, { orderId: 'R1', noOfSubmit: 2, orderNo: 'G' }, { orderId: 'R1', noOfSubmit: 1, orderNo: 'H' }, { orderId: 'R2', noOfSubmit: 1, orderNo: 'H' } ]
该方案存在每次推送都会触发增量的问题,不符合需求。原因是filter方法返回的是数组,在if判断中,空数组会被视为false,非空数组会被视为true,但只要数组中有匹配前缀的记录,每次推送都会执行增量,不管是否符合需求场景,比如推送R1前缀的订单时,会对之前的R1前缀记录多次增量,导致数据错误。
修正后的实现方案
const orders = [{"orderId":"R1-1","noOfSubmit":1,"orderNo":"A"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"B"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"C"}, {"orderId":"R1-1","noOfSubmit":1,"orderNo":"D"}]; function add_order(order_array, order) { // 提前提取新订单的前缀 const prefix = order.orderId.split("-")[0]; // 精准匹配:orderId等于前缀,或者以前缀加连字符开头 const matchedOrders = order_array.filter(o => o.orderId === prefix || o.orderId.startsWith(`${prefix}-`) ); // 有匹配记录时执行增量 if (matchedOrders.length > 0) { matchedOrders.forEach(o => o.noOfSubmit++); } // 添加新订单到数组 order_array.push(order); } add_order(orders, {"orderId":"R1-2","noOfSubmit":1, "orderNo":"E"}); add_order(orders, {"orderId":"R1-2","noOfSubmit":1, "orderNo":"F"}); add_order(orders, {"orderId":"R1","noOfSubmit":1, "orderNo":"G"}); add_order(orders, {"orderId":"R1","noOfSubmit":1, "orderNo":"H"}); add_order(orders, {"orderId":"R2","noOfSubmit":1, "orderNo":"H"}); console.log(orders);
这个方案解决了之前的所有问题:
- 去掉了不必要的重复orderId判断,完全符合需求中“只要前缀匹配就增量”的逻辑
- 使用
startsWith(${prefix}-)结合精准相等判断,避免了前缀误匹配的情况 - 只计算一次前缀,提升了代码性能
内容的提问来源于stack exchange,提问作者Banu
相关产品推荐
相关产品推荐

