如何在js中对嵌套的对象数组进行分组

How to group nested array of objects in js

我有一个嵌套的对象数组。我正在尝试对具有相同值的产品对象进行分组。

每个对象都有一个包含电子邮件的 vendor 属性。我正在尝试通过匹配 vendor email

来对对象进行分组

这是我的数据库的样子:

[
        {
            _id: "622d70a49bd88b1599026318",
            products: [
                {
                    _id: "6223186e2278d4e502f5264a",
                    title: "Product number 1",
                    price: 600,
                    cartQuantity: 1,
                    vendor: {email: "vendor1@gmail.com"}
                },
                {
                    _id: "622d4e9f9bd88b1599026317",
                    title: "asdas",
                    price: 100,
                    cartQuantity: 5,
                    vendor: {
                        email: "vendor2@gmail.com"
                    }
                },
                 {
                    _id: "622d4e9f9bd88b1599026317",
                    title: "asdas",
                    price: 100,
                    cartQuantity: 5,
                    vendor: {
                        email: "vendor2@gmail.com"
                    }
                }
            ]
        }]

我正在尝试使用 reduce 方法,但问题是在 reduce 中使用 map。它多次重复该对象。我也无法获取分组对象。

const groupedMap = db.reduce(
    (entryMap, e) => e.products.map((product) => entryMap.set(product.vendor.email, [...entryMap.get(product)||[], product])),
    new Map()
);

以上代码输出为:

我的期望是:

[0: {"vendor1@gmail.com" => Array(1)}
   key: "vendor1@gmail.com"
   value: [{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email: "vendor1@gmail.com"}}],
1: {"vendor2@gmail.com" => Array(2)}
key: "vendor2@gmail.com"
   value: [{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email: "vendor2@gmail.com"}},
{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email:"vendor2@gmail.com"}}
]
]

尝试创建一个对象,其中键是您分组所依据的值。下一步是 foreach ,你检查数组中的每个对象,你要查找的值是否在创建的对象中 - 如果不是,那么你按搜索值过滤数组并将结果添加到你的对象

遍历数组中的每个项目,查看供应商电子邮件是否作为字典中的键存在,如果存在则将其推送到该数组,否则将供应商电子邮件键的值设置为一个数组其中的当前项目

见下方代码

const data = [{
  _id: "622d70a49bd88b1599026318",
  products: [{
      _id: "6223186e2278d4e502f5264a",
      title: "Product number 1",
      price: 600,
      cartQuantity: 1,
      vendor: {
        email: "vendor1@gmail.com"
      }
    },
    {
      _id: "622d4e9f9bd88b1599026317",
      title: "asdas",
      price: 100,
      cartQuantity: 5,
      vendor: {
        email: "vendor2@gmail.com"
      }
    },
    {
      _id: "622d4e9f9bd88b1599026317",
      title: "asdas",
      price: 100,
      cartQuantity: 5,
      vendor: {
        email: "vendor2@gmail.com"
      }
    }
  ]
}];

const mapped = {};
data[0].products.forEach(item => {
  if (item.vendor.email in mapped) return mapped[item.vendor.email].push(item);

  mapped[item.vendor.email] = [item];
});

const expectedFormat = Object.keys(mapped).map(key => {
  const o = {};
  o[key] = mapped[key];
  
  return o;
});

console.log(expectedFormat)