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

如何用Lodash按itemId、颜色、尺寸分组数组统计商品各店数量及总和

Lodash 实现方案

实现思路

  • 先扁平化原始嵌套数据,给每个商品挂载所属店铺ID,解决原始数据中items是二维数组的嵌套问题
  • 以itemId + '|' + itemColor + '|' + itemSize作为唯一分组键,对所有商品做聚合
  • 提前提取所有店铺ID列表,保证每个分组都能补全所有店铺的数量,无数据时默认赋值0
  • 遍历每个分组,统计各店铺对应数量、计算总数量,输出目标格式数据

完整实现代码

const _ = require('lodash');

// 传入原始店铺商品数据
function statShopItem(originData) {
  // 1. 提取所有店铺ID列表
  const shopIds = _.map(originData, '_id');

  // 2. 扁平化所有商品,挂载所属店铺ID
  const allItems = _.flatMap(originData, shop => {
    // 把二维的items拍平成一维
    const shopItems = _.flatten(shop.items);
    return _.map(shopItems, item => ({
      ...item,
      shopId: shop._id
    }));
  });

  // 3. 按三个字段分组
  const groupedItems = _.groupBy(allItems, item => `${item.itemId}|${item.itemColor}|${item.itemSize}`);

  // 4. 组装目标格式数据
  const result = _.map(groupedItems, group => {
    // 取分组内第一条的公共属性(同分组的name、color、size肯定一致)
    const baseInfo = {
      itemName: group[0].itemName,
      color: group[0].itemColor,
      size: group[0].itemSize
    };
    // 统计各店铺数量
    const shopCount = _.reduce(shopIds, (acc, shopId) => {
      const findItem = _.find(group, { shopId });
      acc[shopId] = findItem ? findItem.itemCount : 0;
      return acc;
    }, {});
    // 计算总数量
    const sum = _.sumBy(group, 'itemCount');
    return {
      ...baseInfo,
      ...shopCount,
      sum
    };
  });

  return result;
}

// 测试示例数据
const testData = [
  {
    "_id": "shop 1",
    "items": [
      [
        {
          "itemId": "111",
          "itemColor": "red",
          "itemSize": "xxl",
          "itemCount": 1,
          "itemName": "example name 1"
        },
        {
          "itemId": "222",
          "itemColor": "green",
          "itemSize": "xl",
          "itemCount": 1,
          "itemName": "example name 2"
        }
      ]
    ]
  },
  {
    "_id": "shop 2",
    "items": [
      [
        {
          "itemId": "111",
          "itemColor": "red",
          "itemSize": "xxl",
          "itemCount": 3,
          "itemName": "example name 1"
        },
        {
          "itemId": "222",
          "itemColor": "blue",
          "itemSize": "L",
          "itemCount": 1,
          "itemName": "example name 2"
        }
      ]
    ]
  }
];

console.log(statShopItem(testData));

输出结果验证

运行上述代码输出的结构和期望的表格格式完全对应:

[
  {
    itemName: 'example name 1',
    color: 'red',
    size: 'xxl',
    'shop 1': 1,
    'shop 2': 3,
    sum: 4
  },
  {
    itemName: 'example name 2',
    color: 'green',
    size: 'xl',
    'shop 1': 1,
    'shop 2': 0,
    sum: 1
  },
  {
    itemName: 'example name 2',
    color: 'blue',
    size: 'L',
    'shop 1': 0,
    'shop 2': 1,
    sum: 1
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 18:06:10