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

基于属性对比对象数组,实现增删改的高效方案

高效更新产品选中状态的解决方案

问题需求

需要对比当前产品状态与传入的选项状态,实现以下逻辑:

  • 若incomingOptions中条目selected为true:更新当前状态中对应项(存在则更新quantity,不存在则新增)
  • 若incomingOptions中条目selected为false:最终状态中移除该条目(无论之前是否存在)
  • 现有方案使用reduce+find,时间复杂度为O(n*m)效率低下,且无法处理新增项,需要更高效的实现。

原有代码问题分析

你当前的reduce实现存在两个核心问题:

  1. 无法新增项:只遍历了currentState.products,完全没处理incomingOptions中的新条目
  2. 效率低下:每次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 };

代码逻辑说明

  1. 构建Map:把现有产品列表转成optionid -> 产品对象的映射,后续查找和修改都是O(1)操作
  2. 遍历传入选项:
    • 对于selected: true的项:用传入的quantity覆盖原有值(如果原有项存在),不存在则直接新增
    • 对于selected: false的项:直接从Map中删除对应key,确保最终状态里没有该条目
  3. Map转数组:将处理后的Map值转为数组,就是最终的产品列表

验证结果

运行上述代码后,updatedProducts会完全匹配你给出的期望最终状态,同时兼顾了性能和功能完整性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:18:23