Cambia array in javascript in oggetto più semplice


17

Ho un semplice JSON con un array che contiene ulteriori oggetti, ecc. Come questo:

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

Ma quello che voglio davvero è un oggetto come questo:

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

Quindi, voglio ridurre l'array a semplici coppie chiave-valore che si trovano all'interno di un array o addirittura di un oggetto (le chiavi sono uniche). Qualcuno ha idea di come ridurlo con alcune di queste fantastiche funzioni di array? Ho solo escogitato qualcosa di simile a uno per ciascuno e ho creato l'oggetto "a mano" per proprietà, ma ricordo che c'erano cose interessanti per array come 'ridurre', l'operatore di diffusione (...), la mappa, ogni, alcuni, ecc.

L'ho provato con qualcosa del tipo:

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

Ma questo mi ha procurato solo un messaggio di errore TypeError: Invalid attempt to destructure non-iterable instance

Modifica: tutte e tre le risposte funzionano perfettamente. Grazie.



La groupdeve essere ignorato?
Bergi,

Sì, il gruppo può essere ignorato, è stata solo un'idea del mio collega utilizzare la stessa chiave in schermate diverse con traduzioni diverse, ma non riesco a trovare alcun uso reale. Ma questa è un'altra domanda molto più tardi :)
Marcel Grüger,

Risposte:


11

Fondamentalmente devi usare al forEachposto della mapfunzione e quindi puoi costruire quell'oggetto su qualunque chiave, coppia di valori che vuoi mantenere.

Prova questo, risolverà il tuo problema.

var temp = {};

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

console.log(temp)

Nota: qui non stiamo usando mapperché vogliamo restituire l'oggetto non un array, quindi possiamo usare la reducefunzione qui per farlo, ma ho pensato che sarebbe stato semplice e facile capire cosa vogliamo e cosa stiamo facendo qui.


10

È possibile utilizzare la reducefunzione JavaScript per creare un oggetto vuoto e inserire ogni chiave e valore in esso.

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);

Modifica: bel suggerimento di Donny Verduijn . Puoi usare la destrutturazione es6 per scrivere la funzione più breve.

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

3
Se ti piace usare la sintassi ES6 puoi anche implementare la funzione di riduzione in questo modo(acc, { key, value }) => ({ ...acc, [key]: value })
Donny Verduijn,

1
Inoltre, è possibile utilizzare l'operatore virgola per evitare il ritorno:const newData = data.reduce((acc, row) => (acc[row.key] = row.value, acc), {});
ElChiniNet

4
Proprio come una curiosità. Qualche tempo fa stavo testando le prestazioni dell'operatore spread per destrutturare oggetti, e anche se è vero che a volte migliora la leggibilità del codice, ha un costo elevato: measurethat.net/Benchmarks/Show/6194/5/ ...
ElChiniNet,

@ElChiniNet Il caso di test collegato riguarda la diffusione dell'array, non la diffusione degli oggetti. (Ma sì, la diffusione ripetuta in un nuovo oggetto è molto più lenta della mutazione di un singolo oggetto)
Bergi

1
@Bergi, qui hai un confronto di questo codice specifico: measurethat.net/Benchmarks/Show/6318/0/…
ElChiniNet

6

utilizzare con il Array#mapsuo creare la chiave e il valore come oggetto e Object.assignconvertire il valore dell'array in oggetto

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)


2

È possibile utilizzare ES6 Mapper tale uso Object.fromEntriesper riconvertire mapin Object.

Per ulteriori informazioni sulla mappa

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

let map = new Map();

languagePack.forEach((val)=>{
  map.set(val.key, val.value);
})
languagePack = Object.fromEntries(map);
console.log(languagePack);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.