Obtiene un resultado específico de mi base de datos que he mostrado a continuación:
const data = { short: 'en', element: { 'dsdsea-22dada-2ffgd-xxada-eeee': { name: 'test name', comment: 'test comment' }, 'adad2a-dda13-dsdad-wwwwd-adaxx': { name: 'name 2' }, }
Y me gustaría aplicar una operación de JavaScript para poder obtener este resultado:
[ { short: 'en', key: "dsdsea-22dada-2ffgd-xxada-eeee.name" value: "test name" }, { short: 'en', key: "dsdsea-22dada-2ffgd-xxada-eeee.comment" value: "test comment" }, { short: 'en', key: "adad2a-dda13-dsdad-wwwwd-adaxx.name" value: "name 2" } ]
He intentado usar una combinación de Object.entries y la función de mapa, pero no sé cómo manejar las teclas dobles en un objeto de un solo elemento.
Esta puede ser una posible solución para lograr el objetivo deseado.
Utiliza Object.entries()
, .map()
, .flatMap()
y plantilla literal usando caracteres de acento grave `` .
Fragmento de código
const getTransformedArray = obj => ( Object.entries(obj.element) // iterate over 'element' key-value pairs .flatMap(([k1, v1]) => ( // k1-v1 where v1 is object (with name, comment props) Object.entries(v1) // iterate over v1's key-value pairs .map(([k2, v2]) => ({ // map each iteration short: obj.short, // create the resulting object key: `${k1}.${k2}`, // 'key' is created using k1, k2 value: v2 // 'value' is v2 as-is })) )) // '.flatMap' used above avoids nesting of arrays ); const data = { short: 'en', element: { 'dsdsea-22dada-2ffgd-xxada-eeee': { name: 'test name', comment: 'test comment' }, 'adad2a-dda13-dsdad-wwwwd-adaxx': { name: 'name 2' } } }; console.log(getTransformedArray(data));
Explicación
Los comentarios en línea en el fragmento de código anterior explican cómo funciona el código.
EDITAR
Respuesta actualizada para usar .flatMap()
como lo ha resaltado @pilchard .
Necesitará dos bucles para iterar sobre cada element
y luego cada valor de esos elementos.
Aquí usando bucles for...of
en Object.entries()
de cada uno, desestructurando en cada nivel para aplicar nombres relevantes a cada propiedad, y luego creando un valor de key
compuesto usando un literal de plantilla
const data = { short: 'en', element: { 'dsdsea-22dada-2ffgd-xxada-eeee': { name: 'test name', comment: 'test comment' }, 'adad2a-dda13-dsdad-wwwwd-adaxx': { name: 'name 2' }, } } const result = []; for (const [key, element] of Object.entries(data.element)) { for (const [prop, value] of Object.entries(element)) { result.push({ short: data.short, key: `${key}.${prop}`, value }) } } console.log(result)
Use Object.keys()
para obtener las claves en el element
, luego asigne la matriz devuelta usando la clave para acceder a cada objeto del elemento y así obtener el nombre. Aquí está el fragmento de código completo:
const input = { short: 'en', element: { 'dsdsea-22dada-2ffgd-xxada-eeee': { name: 'test name', comment: 'test comment' }, 'adad2a-dda13-dsdad-wwwwd-adaxx': { name: 'name 2' }, }, }; function format(data = {}) { const { short = '', element = {} } = data; let result = Object.keys(element).map((key) => { return Object.values(element[key]).map((value) => ({ short, key, value })); }); result = result.flat(); return result; } const result = format(input); console.log(result)
esto imprime:
[ { "short": "en", "key": "dsdsea-22dada-2ffgd-xxada-eeee", "value": "test name" }, { "short": "en", "key": "dsdsea-22dada-2ffgd-xxada-eeee", "value": "test comment" }, { "short": "en", "key": "adad2a-dda13-dsdad-wwwwd-adaxx", "value": "name 2" } ]