基于属性对比对象数组,实现增删改的高效方案
高效更新产品选中状态的解决方案
问题需求
需要对比当前产品状态与传入的选项状态,实现以下逻辑:
- 若
incomingOptions中条目selected为true:更新当前状态中对应项(存在则更新quantity,不存在则新增) - 若
incomingOptions中条目selected为false:最终状态中移除该条目(无论之前是否存在) - 现有方案使用
reduce+find,时间复杂度为O(n*m)效率低下,且无法处理新增项,需要更高效的实现。
原有代码问题分析
你当前的reduce实现存在两个核心问题:
- 无法新增项:只遍历了
currentState.products,完全没处理incomingOptions中的新条目 - 效率低下:每次
find都是遍历整个incomingOptions,数据量大时性能会显著下降
高效解决方案:使用Map优化查找
利用Map的O(1)查找特性,将时间复杂度降低到O(n+m),同时完整覆盖所有需求逻辑:
// 1. 将当前产品转为以optionid为key的Map,方便快速查找 const productMap = new Map(currentState.products.map(item => [item.optionid, item])); // 2. 处理传入的选项 incomingOptions.forEach(opt => { if (opt.selected) { // 选中状态:更新或新增条目 productMap.set(opt.id, { optionid: opt.id, quantity: opt.quantity ?? productMap.get(opt.id)?.quantity ?? 0 }); } else { // 未选中状态:移除对应条目 productMap.delete(opt.id); } }); // 3. 将Map转回数组,得到最终状态 const updatedProducts = Array.from(productMap.values()); // 最终的完整状态 const updatedState = { products: updatedProducts };
代码逻辑说明
- 构建Map:把现有产品列表转成
optionid -> 产品对象的映射,后续查找和修改都是O(1)操作 - 遍历传入选项:
- 对于
selected: true的项:用传入的quantity覆盖原有值(如果原有项存在),不存在则直接新增 - 对于
selected: false的项:直接从Map中删除对应key,确保最终状态里没有该条目
- 对于
- Map转数组:将处理后的Map值转为数组,就是最终的产品列表
验证结果
运行上述代码后,updatedProducts会完全匹配你给出的期望最终状态,同时兼顾了性能和功能完整性。
内容的提问来源于stack exchange,提问作者hybrid9
相关产品推荐
相关产品推荐

