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

114
Vistas
Manera más elegante de agrupar objetos por atributo anidado

Obtengo los datos de una API de terceros y no puedo filtrarlos de antemano. Tengo la siguiente matriz:

 [ [ User1 { attr1: 'abc', attr2: ['0x1', '0xa'] }, User2 { attr1: 'def' attr2: ['0x1', '0xb'] } ] [ User3 { attr1: 'ghi', attr2: ['0x1', '0xa'] }, User4 { attr1: 'jkl', attr2: ['0x1', '0xb'] }, User5 { attr1: 'mno', attr2: ['0x1', '0xc'] } ] ]

El objetivo es conseguir lo siguiente. Básicamente, quiero agrupar a los usuarios según attr2[1] y filtrar a los usuarios que no tienen un par. La clave sería el attr2[1].

 [ { attr2_1: '0xa', attrs: [User1, User3] }, { attr2_1: '0xb', attrs: [User2, User4] } ]

Tengo una solución que funciona, pero me gustaría saber cómo resolverla de manera más elegante.

Agrupo a los usuarios por el segundo atributo.

 const usersByParam = _.chain(allUsers) .flatten() .groupBy(user => user.attr2[1]) .value()

Filtro los usuarios agrupados para eliminar las entradas que no tienen un par (User5 en el ejemplo)

 const filteredUsers = _.omitBy(usersByParam, (val) => {return val.length < 2})

Reviso los resultados filtrados para obtener mis objetos de usuario

 for (const key in filteredUsers) { userArray.push({attr2_1: key, attrs: filteredUsers[key]} as User) }

Me da lo que quiero, pero seguro que hay formas más elegantes de solucionarlo.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Puedes usar JavaScript:

 const data = [{User1: {attr1: 'abc',attr2: ['0x1', '0xa']}},{User2: {attr1: 'def',attr2: ['0x1', '0xb']}},{User3: {attr1: 'ghi',attr2: ['0x1', '0xa']}},{User4: {attr1: 'jkl',attr2: ['0x1', '0xb']}},{User5: {attr1: 'mno',attr2: ['0x1', '0xc']}}] const result = Object.entries( data.reduce((a, c) => { const [k] = Object.keys(c) a[c[k].attr2[1]] = [...(a[c[k].attr2[1]] || []), k] return a }, {}) ) .filter(([, users]) => users.length > 1) .map(([attr2_1, attrs]) => ({ attr2_1, attrs })) console.log(result)

about 4 years ago · Juan Pablo Isaza Denunciar

0

Los datos que publicaste no son JSON válidos. Entonces, suponiendo que se supone que es una matriz de objetos, lo modifiqué en mi código a continuación para reflejar eso.

No estoy seguro de cómo hacerlo en lodash, pero puede usar JavaScript estándar para lograrlo. Mediante el uso de los métodos Array.reduce() y Array.filter() , puede manipular los datos según sus necesidades.

Vea el fragmento a continuación.

 const data = [{ User1: { attr1: 'abc', attr2: ['0x1', '0xa'] } }, { User2: { attr1: 'def', attr2: ['0x1', '0xb'] } }, { User3: { attr1: 'ghi', attr2: ['0x1', '0xa'] } }, { User4: { attr1: 'jkl', attr2: ['0x1', '0xb'] } }, { User5: { attr1: 'mno', attr2: ['0x1', '0xc'] } } ]; const reduced = Object.values(data.reduce((a, c) => { var user = Object.keys(c)[0]; var key = c[user].attr2[1]; a[key] ??= {}; a[key].attr2_1 = key; a[key].attrs ??= []; a[key].attrs.push(user); return a; }, {})).filter(element => element.attrs.length === 2); console.log(reduced);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Tu código ya es elegante, acabo de reemplazar el for ... in con map

 const userArray = _.chain(allUsers) .flatten() .groupBy(user => user.attr2[1]) .omitBy(val => val.length < 2) .map((attrs, attr2_1) => ({ attr2_1, attrs })) .value();
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