जावास्क्रिप्ट को सरल ऑब्जेक्ट में बदलें


17

मेरे पास एक सरल JSON है जिसमें एक सरणी है जिसमें आगे की वस्तुएं शामिल हैं, आदि जैसे:

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

लेकिन जो मैं वास्तव में चाहता हूं वह इस तरह की वस्तु है:

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

इसलिए, मैं सरणी को सरल कुंजी-मान-जोड़े में कम करना चाहता हूं जो किसी सरणी या यहां तक ​​कि एक ऑब्जेक्ट के अंदर हैं (चाबियाँ अद्वितीय हैं)। क्या किसी को इन शांत सरणी कार्यों में से कुछ को कम करने का विचार है? मैं केवल प्रत्येक के लिए कुछ के साथ आया था और "संपत्ति को हाथ से" संपत्ति का निर्माण "संपत्ति के लिए संपत्ति", लेकिन मुझे याद है कि सरणी के लिए कुछ शांत चीजें थीं जैसे 'कम', प्रसार ऑपरेटर (...), मानचित्र, हर, कुछ, आदि

मैंने इसे कुछ इस तरह आज़माया:

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

लेकिन मुझे केवल एक त्रुटि संदेश मिला TypeError: Invalid attempt to destructure non-iterable instance

संपादित करें: सभी तीन उत्तर पूरी तरह से ठीक काम कर रहे हैं। धन्यवाद।



groupअनदेखा किया जा होगा?
बेर्गी

हां, समूह को नजरअंदाज किया जा सकता है, यह केवल मेरे सहकर्मी के लिए अलग-अलग अनुवादों के साथ अलग-अलग स्क्रीन में एक ही कुंजी का उपयोग करने का विचार था, लेकिन मुझे इसके लिए कोई वास्तविक उपयोग नहीं मिल रहा है। लेकिन यह बहुत बाद के लिए एक और सवाल है :)
मार्सेल ग्रुगर

जवाबों:


11

मूल रूप से आपको फ़ंक्शन के forEachबजाय उपयोग करने की आवश्यकता होती है mapऔर फिर आप उस ऑब्जेक्ट का निर्माण कर सकते हैं जो कुछ भी कुंजी, मूल्य जोड़ी आप रखना चाहते हैं।

यह कोशिश करो, यह आपकी समस्या को हल करेगा।

var temp = {};

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

console.log(temp)

नोट: यहां हम उपयोग नहीं कर रहे हैं mapक्योंकि हम ऑब्जेक्ट को एक सरणी नहीं लौटना चाहते हैं, इसलिए, हम reduceऐसा करने के लिए यहां फ़ंक्शन का उपयोग कर सकते हैं , लेकिन मैंने सोचा कि यह समझना आसान और आसान होगा कि हम क्या चाहते हैं और हम यहां क्या कर रहे हैं।


10

आप reduceएक खाली ऑब्जेक्ट बनाने के लिए जावास्क्रिप्ट फ़ंक्शन का उपयोग कर सकते हैं और इसमें प्रत्येक कुंजी और मूल्य डाल सकते हैं।

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

संपादित करें: डॉनी वर्दुइजन का अच्छा सुझाव । फ़ंक्शन को कम लिखने के लिए आप es6 विनाशकारी का उपयोग कर सकते हैं।

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

3
यदि आप ES6 सिंटैक्स का उपयोग करना पसंद करते हैं, तो आप कम फ़ंक्शन को इस तरह भी लागू कर सकते हैं(acc, { key, value }) => ({ ...acc, [key]: value })
डोनी वेरड्यूजन

1
इसके अलावा, आप वापसी से बचने के लिए अल्पविराम ऑपरेटर का उपयोग कर सकते हैं:const newData = data.reduce((acc, row) => (acc[row.key] = row.value, acc), {});
ElChiniNet

4
बस एक जिज्ञासा के रूप में। कुछ समय पहले मैं वस्तुओं को नष्ट करने के लिए प्रसार ऑपरेटर के प्रदर्शन का परीक्षण कर रहा था, और यहां तक ​​कि अगर यह सच है कि कभी-कभी यह कोड की पठनीयता में सुधार करता है, तो इसकी एक उच्च लागत है: नापने का काम। …
ElChiniNet

@ElChiniNet आपके द्वारा लिंक किया गया परीक्षण मामला सरणी प्रसार के बारे में है, वस्तु प्रसार नहीं। (लेकिन हाँ, बार-बार एक नई वस्तु में फैलने से एक ही वस्तु को बदलना बहुत धीमा है)
बर्गी

1
: @Bergi, यहाँ आप इस विशिष्ट कोड की तुलना है measurethat.net/Benchmarks/Show/6318/0/...
ElChiniNet

6

Array#mapइसके साथ उपयोग करें कुंजी और मूल्य के रूप में वस्तु और Object.assignगुप्त सरणी मान से वस्तु बनाएं

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

आप वापस Mapउपयोग Object.fromEntriesकरने के लिए उस उपयोग के लिए ES6 का उपयोग कर सकते हैं ।mapObject

मैप के बारे में अधिक जानकारी के लिए

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.