Javascript'teki diziyi daha basit nesneye dönüştürün


17

Bunun gibi başka nesneler, vb içeren bir dizi ile basit bir JSON var:

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

Ama gerçekten istediğim şey böyle bir nesne:

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

Yani, dizi bir dizi veya hatta bir nesnenin (anahtarlar benzersiz) olan basit anahtar / değer çiftleri azaltmak istiyorum. Herkes bu serin dizi fonksiyonları bazı ile bunu azaltmak için bir fikri var mı? Ben sadece her biri için bir şey ile geldi ve nesne için "el ile" özelliği bina özelliği, ama hatırlıyorum dizi için 'azaltmak', forma operatörü (...), harita, her, bazı, vb.

Gibi bir şey ile denedim:

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

Ama bu bana sadece bir hata mesajı verdi TypeError: Invalid attempt to destructure non-iterable instance

Düzenleme: Her üç yanıt da gayet iyi çalışıyor. Teşekkürler.



groupİhmal edilmelidir?
Bergi

Evet, grup göz ardı edilebilir, sadece iş arkadaşımın farklı anahtarlarla farklı ekranlarda aynı anahtarı kullanması bir fikirdi, ancak bunun için gerçek bir kullanım bulamıyorum. Ama bu çok daha sonra başka bir soru :)
Marcel Grüger

Yanıtlar:


11

Temel forEacholarak mapişlev yerine kullanmanız gerekir ve daha sonra bu nesneyi tutmak istediğiniz herhangi bir anahtar, değer çiftine oluşturabilirsiniz.

Bunu deneyin, sorununuzu çözecektir.

var temp = {};

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

console.log(temp)

Not: Burada mapnesneyi bir dizi değil döndürmek istediğimiz için kullanmıyoruz , bu yüzden reduceburada işlevini kullanabiliriz , ancak bunun ne istediğimizi ve burada ne yaptığımızı anlamanın basit ve kolay olacağını düşündüm.


10

reduceBoş bir nesne oluşturmak ve her anahtarı ve değeri içine koymak için javascript işlevini kullanabilirsiniz .

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

Düzenleme: Donny Verduijn güzel önerisi . İşlevi daha kısa yazmak için es6 yıkımını kullanabilirsiniz.

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

3
ES6 sözdizimini kullanmak isterseniz, azaltma işlevini bu şekilde de uygulayabilirsiniz(acc, { key, value }) => ({ ...acc, [key]: value })
Donny Verduijn

1
Ayrıca, dönüşü önlemek için virgül operatörünü kullanabilirsiniz:const newData = data.reduce((acc, row) => (acc[row.key] = row.value, acc), {});
ElChiniNet

4
Merak gibi. Bir süre önce forma operatörünün nesnelerini yok etmek için performansını test ediyordum ve bazen kodun okunabilirliğini geliştirdiği doğru olsa bile, yüksek bir maliyeti var: Measethat.net/Benchmarks/Show/6194/5/ …
ElChiniNet

@ElChiniNet Bağlandığınız sınama durumu, nesne yayılımıyla değil, dizi yayılımıyla ilgilidir. (Ama evet, tekrar tekrar yeni bir nesneye yaymak tek bir nesneyi mutasyona uğratmaktan çok daha yavaştır)
Bergi

1
@Bergi, burada bu özel kod karşılaştırma var: measurethat.net/Benchmarks/Show/6318/0/...
ElChiniNet

6

ile kullanımı Array#maponun nesne gibi anahtarı ve değeri oluşturmak Object.assignnesneye gizli dizi değeri

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

Sen ES6 kullanabilirsiniz Mapsöz konusu kullanım için Object.fromEntriesdönüştürme için mapiçin arka Object.

Harita hakkında daha fazla bilgi için

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.