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

ReactJS:为唯一食材汇总inputQuantity数值

问题:合并食材数组时正确汇总inputQuantity值

现有食材对象数组:

[
    {
        "id": null,
        "value": "Apples",
        "label": "Apples",
        "Quantity": 1,
        "Weight": "0.075",
        "inputQuantity": "2",
        "Category": "BREAKFAST",
        "ItemCopy": 2,
        "PM": "123"
    },
    {
        "Quantity": 1,
        "value": "Apples",
        "Weight": "0.075",
        "id": null,
        "label": "Apples",
        "inputQuantity": "3",
        "Category": "BREAKFAST",
        "ItemCopy": 2,
        "PM": "123"
    },
    {
        "value": "Asparagus",
        "id": "TnwiO97ZHCsz4vl9A9OR",
        "label": "Asparagus",
        "Weight": "0.185",
        "Quantity": 1,
        "inputQuantity": "3",
        "Category": "BREAKFAST",
        "ItemCopy": 1,
        "PM": "123"
    }
]

原代码尝试按label去重并计算ItemCopy,但汇总后的inputQuantity未正确累加(Apples应为5,Asparagus应为3),原实现代码如下:

function getUniqueDataCount(objArr, propName) {
    const mi = [...objArr]
    var data = [];
    objArr.forEach(function (d, index) {
      if (d[propName]) {
        data.push(d[propName]);
      }
    });
    var uniqueList = [...new Set(data)];
    var dataSet = {};
    for (var i = 0; i < data.length; i++) {
      dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length;
      mi[i].ItemCopy = data.filter(x => x == data[i]).length
    }
    return mi;
  }

 useMemo(() => {
    mydata = getUniqueDataCount(daataa, 'label');
  }, [daataa])

  useMemo(() => {
    newCheck = Object.values(mydata?.reduce((acc, cur) => Object.assign(acc, { [cur?.label]: cur }), {}))
  }, [mydata])
修改方案

直接在reduce阶段完成去重、ItemCopy计数和inputQuantity累加,简化逻辑同时保证计算准确:

const newCheck = useMemo(() => {
  return Object.values(daataa.reduce((acc, cur) => {
    const key = cur.label;
    if (!acc[key]) {
      // 首次出现该食材时,复制对象并初始化累加值
      acc[key] = { ...cur };
      acc[key].inputQuantity = parseInt(cur.inputQuantity, 10);
      acc[key].ItemCopy = 1;
    } else {
      // 重复食材累加数量,更新计数
      acc[key].inputQuantity += parseInt(cur.inputQuantity, 10);
      acc[key].ItemCopy += 1;
    }
    // 保持inputQuantity为字符串类型(不需要可省略)
    acc[key].inputQuantity = acc[key].inputQuantity.toString();
    return acc;
  }, {}));
}, [daataa]);

逻辑说明

  1. 用reduce遍历数组,以label作为分组键
  2. 首次遇到某类食材时,复制原对象并将inputQuantity转为数字初始化,同时设置ItemCopy为1
  3. 遇到重复食材时,累加inputQuantity数值,同时增加ItemCopy计数
  4. 可选:将累加后的数值转回字符串,保持与原字段类型一致
  5. 最后用Object.values将分组对象转为最终数组

修改后得到的newCheck结果:

[
    {
        "id": null,
        "value": "Apples",
        "label": "Apples",
        "Quantity": 1,
        "Weight": "0.075",
        "inputQuantity": "5",
        "Category": "BREAKFAST",
        "ItemCopy": 2,
        "PM": "123"
    },
    {
        "value": "Asparagus",
        "id": "TnwiO97ZHCsz4vl9A9OR",
        "label": "Asparagus",
        "Weight": "0.185",
        "Quantity": 1,
        "inputQuantity": "3",
        "Category": "BREAKFAST",
        "ItemCopy": 1,
        "PM": "123"
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:55:28