Alterar matriz em javascript para objeto mais simples




arrays (3)

Eu tenho um JSON simples com uma matriz que contém outros objetos, etc. como este:

languagePack:
[
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
]

Mas o que eu realmente quero é um objeto como este:

languagePack: 
{
    'Username': 'Benutzername',
    'Password': 'Passwort'
}

Portanto, quero reduzir a matriz para pares simples de valor-chave que estão dentro de uma matriz ou mesmo de um objeto (as chaves são únicas). Alguém tem uma idéia de como reduzir isso com algumas dessas funções de matriz legal? Eu só criei algo como um para cada um e construí o objeto "à mão" propriedade para propriedade, mas lembro que havia algumas coisas legais para matriz como 'reduzir', o operador de propagação (...), mapa, todos, alguns etc.

Eu tentei com algo como:

var temp = this.languagePack.map(([key, value]) => ({key,value}))
console.log(temp)

Mas isso só me deu uma mensagem de erro TypeError: Invalid attempt to destructure non-iterable instance

Edit: Todas as três respostas estão funcionando perfeitamente. Obrigado.


Basicamente, você precisa usar a função forEach vez da função map e, em seguida, pode criar esse objeto para qualquer par de chaves e valores que deseja manter.

Tente isso, ele resolverá o seu problema.

var temp = {};

this.languagePack.forEach(({key,value}) => {
    temp[key] = value
})

console.log(temp)

Nota: Aqui não estamos usando o map porque queremos retornar o objeto e não uma matriz, portanto, podemos usar a função de reduce aqui para fazê-lo, mas achei que seria simples e fácil entender o que queremos e o que estamos fazendo aqui .


Você pode usar a função de reduce javascript para criar um objeto vazio e colocar cada chave e valor nele.

const data = [
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
];

const newData = data.reduce((acc, row) => {
  acc[row.key] = row.value;
  return acc;
}, {});

console.log(newData);

Edit: Nice sugerir Donny Verduijn . Você pode usar es6 destructuring para escrever a função mais curta.

const newData = data.reduce((acc, { key, value }) => ({ ...acc, [key]: value }), {});

use com o Array#map crie a chave e o valor como objeto e Object.assign valor secreto do array ao objeto

const languagePack = [ { 'key': 'Username', 'value': 'Benutzername', 'group': 'default' }, { 'key': 'Password', 'value': 'Passwort', 'group': 'default' } ];

var res = Object.assign({},...languagePack.map(({key,value}) => ({[key]:value})))

console.log(res)





arrays