सरणी से ऑब्जेक्ट बनाएँ


91

मैं सरणी की सूची से ऑब्जेक्ट बनाना चाहता हूं। मेरे पास एक सरणी है जो गतिशील है जो मानती है कि यह इस तरह दिखती है:

var dynamicArray = ["2007", "2008", "2009", "2010"];

और कुछ जावास्क्रिप्ट es6 के साथ मैं इस तरह से एक वस्तु बनाना चाहता हूं:

const obj = {
    2007: {
        x: width / 5,
        y: height / 2
    },
    2008: {
        x: (2 / 5) * width,
        y: height / 2
    },
    2009: {
        x: (3 / 5) * width,
        y: height / 2
    },
    2010: {
        x: (4 / 5) * width,
        y: height / 2
    }
}

आंतरिक वस्तुओं के बारे में चिंता मत करो, लेकिन सिर्फ इस तरह से एक संरचना बनाना चाहते हैं:

 obj = {
      2007: ...,
      2008: ...,
      ...
    }

कृपया मदद करें, धन्यवाद।


2
ठीक है। आपने क्या प्रयास किया है? कहाँ रह गया। आपने क्या शोध किया है? आपने देखा है इस उदाहरण के लिए,?
TJ Crowder

जवाबों:


217

केवल

 const obj = {};

 for (const key of yourArray) {
      obj[key] = whatever;
 }

या यदि आप "कार्यात्मक" शैली पसंद करते हैं:

 const obj = yourArray.reduce((o, key) => Object.assign(o, {[key]: whatever}), {});

आधुनिक वस्तु प्रसार ऑपरेटर का उपयोग करना:

const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})

उदाहरण:

[
  { id: 10, color: "red" },
  { id: 20, color: "blue" },
  { id: 30, color: "green" }
].reduce((acc, cur) => ({ ...acc, [cur.color]: cur.id }), {})

आउटपुट:

{red: 10, blue: 20, green: 30}

यहाँ दिया गया है कि यह कैसे काम करता है:

reduceएक खाली वस्तु ( {}अंत में खाली ) के साथ आरंभीकृत किया जाता है , इसलिए पहले पुनरावृत्ति चर हैं acc = {} cur = { id: 10, color: "red" }। फ़ंक्शन एक वस्तु देता है - यही कारण है कि फ़ंक्शन बॉडी को कोष्ठक में लपेटा जाता है => ({ ... })। स्प्रेड ऑपरेटर पहले पुनरावृत्ति पर कुछ भी नहीं करता है, इसलिए red: 10पहले आइटम के रूप में सेट किया गया है।

दूसरे पुनरावृत्ति चर पर हैं acc = { red: 10 } cur = { id: 20, color: "blue" }। यहां प्रसार ऑपरेटर फैलता है acc और फ़ंक्शन वापस लौटता है { red: 10, blue: 20 }

तीसरा पुनरावृत्ति acc = { red: 10, blue: 20 } cur = { id: 30, color: "green" }, इसलिए जब accऑब्जेक्ट के अंदर फैला होता है , तो हमारा फ़ंक्शन अंतिम मान लौटाता है।


1
धन्यवाद! इसने आवश्यकतानुसार काम किया। मुझे array.reduceफंक्शन के बारे में कभी नहीं पता था ।
हुसैन देहगमवाला

1
यदि आप कार्यात्मक शैली पसंद करते हैं, और मैं करता हूं, तो आपको उपयोग करना चाहिए const। वास्तव में आपको इसका उपयोग करना चाहिए। इसके अलावा, यदि आपके पास ES नेक्स्ट रेस्ट / स्प्रेड सिंटैक्स (टाइपस्क्रिप्ट या बैबल के माध्यम से) तक पहुंच है, तो आप लिख सकते हैं const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})और यहां तक ​​कि बीज को उत्परिवर्तित करने से भी बच सकते हैं : पी
अलुआन हदद

1
@AluanHaddad: अच्छा सुझाव, पोस्ट को CW में बदल दिया, संपादित करने के लिए स्वतंत्र महसूस करें।
georg

({... o, [key]: CandidDoc [key]}) .. जहाँ CandidDoc कुछ पूजो है। मैं केवल उन मूल्यों को लेना चाहता हूं जो उम्मीदवारडॉक में परिभाषित हैं। लेकिन मैं अभिभावकों के साथ भ्रमित हूं, काम करने के लिए एक 'रिटर्न' या एक बयान नहीं मिल सकता है। क्या आप मुझे सही दिशा में ले जा सकते हैं - डॉक्यूमेंटेशन पढ़ने से नहीं डरते।
टेरी

1
@ कैम: धन्यवाद, पोस्ट सीडब्ल्यू है, संपादित करने के लिए स्वतंत्र महसूस करें।
जियोर्ज

38

Object.fromEntriesECMAScript 2019 से नया , एक सरणी से मानों को कुंजियों में कुंजियों में बदलना और भी आसान बना देता है, जैसे कि

const dynamicArray = ["2007", "2008", "2009", "2010"];
const obj = Object.fromEntries(
  dynamicArray.map(year => [year, {
    something: "based",
    on: year
  }])
)

console.log(obj)


21

js में es6 एरे के लिए फंक्शन कम करें मैं इसे इस तरह से करता हूं

let x = [1,2,3]
let y = x.reduce((acc, elem) => {
  acc[elem] = elem // or what ever object you want inside
  return acc
}, {})
console.log(y) // {1:1, 2:2, 3:3}

3
इससे भी कम:[1, 2, 3].reduce((x, y)=>(x[y] = 1, x), {})
एक्सबुक

5
var keys = ['key1', 'key2', 'key3']

var object = Object.assign({}, ...Object.entries({...keys}).map(([a,b]) => ({ [b]: 'someValue' })))
console.log(object)

इससे उत्पादन होगा

{ key1: 'someValue', key2: 'someValue', key3: 'someValue' }

0

मैंने पाया कि आप वास्तव में Object.assign()सीधे प्रसार ऑपरेटर के साथ उपयोग कर सकते हैं । किसी फ़ंक्शन reduceया mapफ़ंक्शन के साथ किसी भी अधिक जटिलता का परिचय देने की आवश्यकता नहीं है ।

बस करो Object.assign(...yourArray, {})और आप अपना वांछित परिणाम प्राप्त करेंगे। यदि आप इसके बजाय अपने ऑब्जेक्ट की सरणी को किसी अन्य ऑब्जेक्ट में मर्ज करना चाहते हैं तो आप कॉल भी कर सकते हैं Object.assign(...yourArray, yourObject)और यह भी ठीक काम करेगा।

आप एक ही ऑब्जेक्ट में दो सरणियों को मर्ज करने के लिए भी इसी विधि का उपयोग कर सकते हैं, भले ही सरणियों में से एक में ऑब्जेक्ट्स न हों, लेकिन केवल आदिम मान हों - हालाँकि, यदि आप ऐसा करते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि कम से कम एक सरणियाँ केवल ऑब्जेक्ट्स को रखती हैं एक आदिम इसके सूचकांक के लिए डिफ़ॉल्ट होगा key, इसलिए आपको डुप्लिकेट कुंजी होने पर त्रुटियां मिलेंगी।

हालांकि ओपी उद्देश्य के लिए ऐसी त्रुटियों का कोई खतरा नहीं है क्योंकि वह एक खाली वस्तु के साथ विलय कर रहा है, जो सबसे सुरक्षित तरीका है।

const arr = [
  { a: 0 },
  { c: 1 },
  { e: 2 },
];

const obj = Object.assign(...arr, {});

console.log(obj)

// Results to:
// Object { a: 0, c: 1, e: 2 }

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