Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

112
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!