Ändern Sie das Array in Javascript in ein einfacheres Objekt


17

Ich habe einen einfachen JSON mit einem Array, das weitere Objekte usw. wie folgt enthält:

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

Aber was ich wirklich will, ist ein Objekt wie dieses:

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

Daher möchte ich das Array auf einfache Schlüssel-Wert-Paare reduzieren, die sich innerhalb eines Arrays oder sogar eines Objekts befinden (Schlüssel sind eindeutig). Hat jemand eine Idee, wie man dies mit einigen dieser coolen Array-Funktionen reduzieren kann? Ich habe mir nur so etwas wie ein für jedes ausgedacht und das Objekt "von Hand" Eigenschaft für Eigenschaft erstellt, aber ich erinnere mich, dass es einige coole Dinge für das Array gab, wie "Reduzieren", den Spread-Operator (...), Karte, alle, einige usw.

Ich habe es mit so etwas versucht:

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

Aber das hat mir nur eine Fehlermeldung gebracht TypeError: Invalid attempt to destructure non-iterable instance

Bearbeiten: Alle drei Antworten funktionieren einwandfrei. Vielen Dank.


2
Mögliches Duplikat der Formatierung der Array-Liste auf json
adiga

Das groupsoll ignoriert werden?
Bergi

Ja, die Gruppe kann ignoriert werden. Es war nur eine Idee meines Kollegen, denselben Schlüssel in verschiedenen Bildschirmen mit unterschiedlichen Übersetzungen zu verwenden, aber ich kann keine wirkliche Verwendung dafür finden. Aber das ist eine andere Frage für viel später :)
Marcel Grüger

Antworten:


11

Grundsätzlich müssen Sie forEachanstelle der mapFunktion verwenden, und dann können Sie dieses Objekt für jedes Schlüssel- und Wertepaar erstellen, das Sie behalten möchten.

Versuchen Sie dies, es wird Ihr Problem lösen.

var temp = {};

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

console.log(temp)

Hinweis: Hier verwenden wir kein mapObjekt , da wir kein Array zurückgeben möchten. Daher können wir reducehier die Funktion verwenden, aber ich dachte, dies wäre einfach und leicht zu verstehen, was wir wollen und was wir hier tun.


10

Mit der Javascript- reduceFunktion können Sie ein leeres Objekt erstellen und jeden Schlüssel und Wert darin einfügen.

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: Netter Vorschlag von Donny Verduijn . Sie können die es6-Destrukturierung verwenden, um die Funktion kürzer zu schreiben.

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

3
Wenn Sie die ES6-Syntax verwenden möchten, können Sie die Reduktionsfunktion auch auf diese Weise implementieren(acc, { key, value }) => ({ ...acc, [key]: value })
Donny Verduijn,

1
Sie können auch den Komma-Operator verwenden, um die Rückgabe zu vermeiden:const newData = data.reduce((acc, row) => (acc[row.key] = row.value, acc), {});
ElChiniNet

4
Nur aus Neugier. Vor einiger Zeit habe ich die Leistung des Spread-Operators getestet, um Objekte zu zerstören, und selbst wenn es stimmt, dass es manchmal die Lesbarkeit des Codes verbessert, hat es hohe Kosten: messethat.net/Benchmarks/Show/6194/5/ …
ElChiniNet

@ElChiniNet In dem von Ihnen verknüpften Testfall geht es um die Array-Streuung, nicht um die Objektverbreitung. (Aber ja, das wiederholte Ausbreiten in ein neues Objekt ist viel langsamer als das Mutieren eines einzelnen Objekts)
Bergi

1
@Bergi, hier haben Sie einen Vergleich dieses spezifischen Codes: messethat.net/Benchmarks/Show/6318/0/…
ElChiniNet

6

Verwenden Sie mit Array#mapseiner Funktion den Schlüssel und den Wert als Objekt und den Object.assignverdeckten Array-Wert für das Objekt

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

Sie können ES6 Mapfür diese Verwendung verwenden Object.fromEntries, um mapzurück zu konvertieren Object.

Weitere Informationen zu Map

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.