Tengo un JSON simple con una matriz que contiene más objetos, etc. como este:
languagePack:
[
{
'key': 'Username',
'value': 'Benutzername',
'group': 'default'
},
{
'key': 'Password',
'value': 'Passwort',
'group': 'default'
}
]
Pero lo que realmente quiero es un objeto como este:
languagePack:
{
'Username': 'Benutzername',
'Password': 'Passwort'
}
Entonces, quiero reducir la matriz a simples pares clave-valor que están dentro de una matriz o incluso un objeto (las claves son únicas). ¿Alguien tiene una idea de cómo reducir esto con algunas de estas geniales funciones de matriz? Solo se me ocurrió algo así como un para cada uno y construir la propiedad del objeto "a mano" para la propiedad, pero recuerdo que había algunas cosas interesantes para la matriz como 'reducir', el operador de propagación (...), el mapa, cada, algunos, etc.
Lo probé con algo como:
var temp = this.languagePack.map(([key, value]) => ({key,value}))
console.log(temp)
Pero eso solo me dio un mensaje de error TypeError: Invalid attempt to destructure non-iterable instance
Editar: Las tres respuestas funcionan perfectamente bien. Gracias.
fuente
group
será ignorado?Respuestas:
Básicamente, debe usar en
forEach
lugar de lamap
función y luego puede construir ese objeto a cualquier clave, par de valores que desee mantener.Pruebe esto, resolverá su problema.
Nota: Aquí no estamos usando
map
porque queremos devolver un objeto, no una matriz, por lo que podemos usar lareduce
función aquí para hacerlo, pero pensé que esto sería simple y fácil de entender lo que queremos y qué estamos haciendo aquí.fuente
Puede usar la
reduce
función de JavaScript para crear un objeto vacío y poner cada clave y valor en él.Editar: Buena sugerencia de Donny Verduijn . Puede usar es6 desestructuración para escribir la función más corta.
fuente
(acc, { key, value }) => ({ ...acc, [key]: value })
const newData = data.reduce((acc, row) => (acc[row.key] = row.value, acc), {});
utilizar con
Array#map
su crear la clave y el valor como objeto y elObject.assign
valor de matriz encubierta para objetarfuente
Puede usar ES6
Map
para ese usoObject.fromEntries
paramap
volver a convertirObject
.Para más información sobre Mapa
fuente