জাভাস্ক্রিপ্টে অ্যারেটিকে সহজ বস্তুতে পরিবর্তন করুন


17

আমার কাছে একটি অ্যারে সহ একটি সাধারণ জেএসওএন রয়েছে এতে আরও অবজেক্ট ইত্যাদি রয়েছে:

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এবং তারপরে আপনি যে অবজেক্টটি রাখতে চান তার যে মান, মান জোড়াটি তৈরি করতে পারেন object

এটি চেষ্টা করুন, এটি আপনার সমস্যার সমাধান করবে।

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), {});
এলচিনি নেট

4
ঠিক কৌতূহল হিসাবে। কিছু সময় আগে আমি স্ট্র্যাড অপারেটরের কার্যকারিতা পরীক্ষা করছিলাম বস্তুগুলি ধ্বংস করতে এবং এমনকি যদি এটি সত্য হয় যে কখনও কখনও এটি কোডের পঠনযোগ্যতা উন্নত করে তবে এটির একটি উচ্চ ব্যয়ও রয়েছে: পরিমাপতটনেট
এলচিনি নেট

@ এলসিচিনি নেট আপনার সংযুক্ত পরীক্ষার কেসটি অ্যারে স্প্রেড সম্পর্কিত, অবজেক্ট স্প্রেডের নয়। (তবে হ্যাঁ, বারবার নতুন বস্তুতে ছড়িয়ে পড়া কোনও একক বস্তুর পরিবর্তনের চেয়ে ধীর গতিতে)
বার্গি

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

আপনি ES6 ব্যবহার করতে পারেন Mapযে ব্যবহারের জন্য Object.fromEntriesরূপান্তর করতে mapফিরে Object

মানচিত্র সম্পর্কে আরও তথ্যের জন্য

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.