Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

262
Vistas
Cómo agrupar una matriz anidada de objetos en js

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: ingrese la descripción de la imagen aquí

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"}} ] ]
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

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)

about 4 years ago · Juan Pablo Isaza Denunciar

0

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

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda