Tengo una matriz anidada de objetos. Estoy tratando de agrupar objetos de productos que tienen el mismo valor.
Cada objeto tiene una propiedad de vendor que contiene un correo electrónico. Estoy tratando de agrupar los objetos haciendo coincidir el vendor email
Así es como se ve mi base de datos:
[ { _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" } } ] }] Estoy tratando de hacerlo con el método de reducción, pero el problema es usar el map dentro de la reduce . Repite el objeto muchas veces. Tampoco puedo obtener los objetos agrupados.
const groupedMap = db.reduce( (entryMap, e) => e.products.map((product) => entryMap.set(product.vendor.email, [...entryMap.get(product)||[], product])), new Map() ); La salida del código anterior es: 
Mi expectativa es:
[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"}} ] ]Recorra cada elemento en la matriz y vea si el correo electrónico del proveedor ya existe como una clave en un diccionario, si existe, insértelo en esa matriz, de lo contrario, establezca el valor de la clave de correo electrónico del proveedor igual a una matriz con el elemento actual en ella
Ver código a continuación
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)intenta crear un objeto donde la clave sea el valor por el que agrupas. el siguiente paso es foreach en el que verifica cada objeto en la matriz, si el valor que está buscando está en el objeto creado; de lo contrario, filtra la matriz por valor buscado y agrega el resultado a su objeto