एरे को ऑब्जेक्ट में कन्वर्ट करें


514

परिवर्तित करने का सबसे अच्छा तरीका क्या है:

['a','b','c']

सेवा:

{
  0: 'a',
  1: 'b',
  2: 'c'
}

3
हो सकता है कि उसे कुछ डक-टाइपिंग कोड के लिए यह सोचने की ज़रूरत हो कि यह एक ऐरे उदाहरण है
Pointy

6
इसके लायक उनका कहना है कि जावास्क्रिप्ट सरणियों हैं वस्तुओं।
स्पुडली

यदि कोई और व्यक्ति लोधश समाधान की तलाश में है, तो विचार करें _.keyBy(पूर्व में _.indexBy): lodash.com/docs#keyBy
2540625

इसमें कुछ समय भ्रमित क्योंकि सरणियों वस्तुओं पहले से ही कर रहे हैं, लेकिन मुझे लगता है कि प्रश्न के बिंदु परिवर्तित सरणी विदेशी वस्तु एक करने के लिए साधारण वस्तु
ओरिऑल

1
लॉडश के साथ ऐसा करने का एक सरल तरीका है _.toPlainObject। Ex:var myObj = _.toPlainObject(myArr)
जूलियन सोरो

जवाबों:


473

ECMAScript 6 आसानी से पॉलीफिल करने योग्य है Object.assign:

Object.assign()विधि लक्ष्य वस्तु के लिए एक या अधिक स्रोत वस्तुओं से सभी गणनीय खुद गुण के मूल्यों की प्रतिलिपि करने के लिए किया जाता है। यह लक्ष्य वस्तु को लौटा देगा।

Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}

lengthसरणी की अपनी संपत्ति की प्रतिलिपि नहीं बनाई गई है क्योंकि यह गणना योग्य नहीं है।

इसके अलावा, आप उसी परिणाम को प्राप्त करने के लिए ES6 स्प्रेड सिंटैक्स का उपयोग कर सकते हैं :

{ ...['a', 'b', 'c'] }

बस इंगित करना चाहते हैं - यदि आपके पास पहले से ही मूल ऑब्जेक्ट से { ...[sortedArray]}
छंटनी

ओरोल, क्या 0 और 1 के बजाय एक निश्चित कुंजी सेट करने का एक तरीका है?
मेनई अला एडडिन

488

इस तरह एक समारोह के साथ:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    rv[i] = arr[i];
  return rv;
}

आपका सरणी पहले से ही कमोबेश एक वस्तु है, लेकिन सरणियों में पूर्णांक नाम वाले गुणों के संबंध में कुछ "रोचक" और विशेष व्यवहार है। उपरोक्त आपको एक सादी वस्तु देगा।

ओह को भी संपादित करें आप सरणी में "छेद" के लिए जिम्मेदार हो सकते हैं:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[i] = arr[i];
  return rv;
}

आधुनिक जावास्क्रिप्ट रनटाइम में, आप इस .reduce()विधि का उपयोग कर सकते हैं :

var obj = arr.reduce(function(acc, cur, i) {
  acc[i] = cur;
  return acc;
}, {});

वह भी सरणी में "छेद" से बचता है, क्योंकि यह कैसे .reduce()काम करता है।


2
@ m93a यह पहले से ही एक वस्तु है। []यदि आप संख्यात्मक संपत्ति कुंजी और "लंबाई" संपत्ति का उपयोग नहीं करने जा रहे हैं , तो जावास्क्रिप्ट में, वास्तव में कोई ऐरे उदाहरण ( ) नहीं है।
नुकीले

14
const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
पैरा रीमेसन

3
तीर + विनाशकारी वाक्यविन्यास w / o स्पष्ट वापसी:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
मार्क शीब

2
@eugene_sunic वास्तव में, लेकिन उस दृष्टिकोण उपलब्ध है जब मैं 2010 में :) इस जवाब नहीं था
नुकीले

2
जैसा कि @miro बताता है, हर बार एक नई वस्तु बनाना आवश्यक नहीं है, और वास्तव में बनाए गए प्रारंभिक ऑब्जेक्ट को हेरफेर करने की तुलना में बहुत धीमा है। 1000 तत्वों की एक सरणी पर JSPerf परीक्षण चलाना , मौजूदा वस्तु को बदलने की तुलना में हर बार एक नई वस्तु बनाना 1,000 गुना धीमा है। jsperf.com/…
romellem

281

आप एक संचायक उर्फ ​​का उपयोग कर सकते हैं reduce

['a','b','c'].reduce(function(result, item, index, array) {
  result[index] = item; //a, b, c
  return result;
}, {}) //watch out the empty {}, which is passed as "result"

{}एक प्रारंभिक बिंदु के रूप में एक खाली वस्तु पास करें ; फिर "संवर्द्धन" कि वस्तु आकस्मिक रूप से। पुनरावृत्तियों के अंत में, resultहोगा{"0": "a", "1": "b", "2": "c"}

यदि आपका सरणी कुंजी-मूल्य जोड़ी वस्तुओं का एक सेट है:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  result[key] = item[key];
  return result;
}, {});

उत्पादन करेंगे: {a: 1, b: 2, c: 3}

पूर्णता की खातिर, reduceRightआप रिवर्स क्रम में अपने सरणी पर पुनरावृति करने की अनुमति देता है:

[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)

उत्पादन करेंगे: {c:3, b:2, a:1}

आपका संचयकर्ता आपके लिए किसी विशेष उद्देश्य से किसी भी प्रकार का हो सकता है। उदाहरण के लिए, किसी सरणी में अपनी वस्तु की कुंजी और मान स्वैप करने के लिए, पास करें []:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  var value = item[key];
  var obj = {};
  obj[value] = key;
  result.push(obj);
  return result;
}, []); //an empty array

उत्पादन करेंगे: [{1: "a"}, {2: "b"}, {3: "c"}]

इसके विपरीत map, reduce1-1 मानचित्रण के रूप में उपयोग नहीं किया जा सकता है। जिन वस्तुओं को आप शामिल करना या बाहर करना चाहते हैं, उन पर आपका पूर्ण नियंत्रण है। इसलिए reduceआपको वह प्राप्त करने की अनुमति देता filterहै, जो reduceबहुत बहुमुखी बनाता है :

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  if(index !== 0) { //skip the first item
    result.push(item);
  }
  return result;
}, []); //an empty array

उत्पादन करेंगे: [{2: "b"}, {3: "c"}]

सावधानी : reduceऔर Object.keyका हिस्सा हैं ECMA 5th edition; आपको उन ब्राउज़रों के लिए एक पॉलीफ़िल प्रदान करना चाहिए जो उनका समर्थन नहीं करते हैं (विशेष रूप से IE8)।

मोज़िला द्वारा एक डिफ़ॉल्ट कार्यान्वयन देखें ।


1
जब आप वस्तुओं के मानचित्र का उपयोग कर रहे हों तो एक रेडक्स स्टोर बनाए रखने में मददगार और आपको एक चाबी छोड़ने की जरूरत है
druvpatel

101

यदि आप jquery का उपयोग कर रहे हैं:

$.extend({}, ['a', 'b', 'c']);

4
अजीब है, अगर मैं एक ऐरे वेरिएबल में देता हूं तो यह हर कैरेक्टर को एक अलग ऑब्जेक्ट में डालती है: 0: "a", 1: ",", 2: "b" ... इसलिए यह कोट्स को नजरअंदाज करता है, लेकिन इसमें कॉमा भी शामिल है। ।
ट्राइस्पेस स्पेस

@ मोम मुझे लगता है कि ऐसा कोई व्यवहार नहीं है। लौटी हुई वस्तु वह {0: 'a', 1: 'b', 2: 'c'}है जो अपेक्षित परिणाम है।
ivkremer

3
क्या गैर-संख्यात्मक तरीके से कुंजियों को सूचित करते हुए $ .extend का उपयोग करने का एक तरीका है, अर्थात्: सरणी आइटम पर केल्चुलेशन बना रहे हैं?
डेवी लिमा

सुपर awsome और लघु परीक्षण
फैसल महमूद एवान

63

पूर्णता के लिए, ECMAScript 2015 (ES6) का प्रसार। या तो ट्रांसपिलर (बैबल) या कम से कम ES6 चलाने वाले वातावरण की आवश्यकता होगी।

console.log(
   { ...['a', 'b', 'c'] }
)


2
वास्तव में यह मूल रूप से ES2015 में उपलब्ध नहीं है। हालाँकि यह बहुत ही सुंदर है।
अलुआन हदद

47

मैं शायद इसे इस तरह से लिखूंगा (चूंकि बहुत कम ही मुझे हाथ में अंडरस्कोर लाइब्रेरी नहीं होगी):

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }

9
आपने मेरी प्रतिक्रिया को अस्वीकार कर दिया, लेकिन कोई टिप्पणी नहीं? मेरा उत्तर सही और परीक्षित है। आपत्ति क्या है?
डेव डॉपसन

14
इस सवाल का कोई अंडरस्कोर टैग नहीं है, और आप नोड.जेएस या एक आवश्यक पुस्तकालय भी मान रहे हैं।
डेविड हैवलिंग

10
अंडरस्कोर क्लाइंट और सर्वर दोनों पर बहुत आम है। यह Backbone.js के लिए माना जाता है और संभवतः सबसे आम उपयोगिता पुस्तकालय है। कहा जा रहा है, मैंने यह स्पष्ट करने के लिए आवश्यकता रेखा को शामिल किया कि मैं एक पुस्तकालय का उपयोग कर रहा हूं। "अपने पृष्ठ में अंडरस्कोर जोड़ें।" का वर्णन करने के लिए कोई 1-लाइनर नहीं है, इसलिए ब्राउज़र वातावरण के लिए कुछ अनुवाद आवश्यक है
डेव डॉपसन

6
फिर भी, अगर आप अनडर्सकोर का उपयोग कर रहे हैं, तो एक साधारण obj=_.extend({},a);काम करेगा। इसके अलावा, यदि आप सरणियों के माध्यम से पुनरावृत्ति कर रहे हैं तो मैं कहूंगा कि _.eachइससे अधिक उपयुक्त होगा _.map। सभी के सभी, यह कई स्तरों पर एक अच्छा जवाब नहीं है।
डेविड सर्वाइविंग

4
"आपको अंडरस्कोर या लो-डैश का उल्लेख किए बिना जवाब देना चाहिए" लोग बहुत परेशान हैं। यह कहने के लिए तुलनीय है कि आपको मानक पुस्तकालयों का उल्लेख किए बिना C ++ प्रश्नों का उत्तर देना चाहिए। यदि अंडरस्कोर या लो-डैश विकल्प नहीं है, तो ओपी को इसका उल्लेख करना चाहिए।
चार्ली मार्टिन

26

यहाँ पूर्णता के लिए एक O (1) ES2015 विधि दी गई है।

var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object

(१) एमडीएन के अनुसार , किसी वस्तु का [[प्रोटोटाइप]] बदलना बहुत ही धीमा ऑपरेशन है। (२) इससे स्वयं की lengthसंपत्ति नहीं निकलती है । (3) वस्तु अभी भी, एक सरणी है Array.isArray(arr) === true। (4) विशेष सरणी व्यवहार को हटाया नहीं जाता है, उदाहरण के लिए arr.length = 0सभी सूचकांकों को हटा दिया जाता है । (५) इसलिए, मुझे लगता Object.assignहै कि बहुत बेहतर है
ओरिऑल

1
@ ऑरिड mdn गलत है, कम से कम V8 (लेकिन अन्य इंजनों में) यह इस विशेष मामले में एक बहुत तेज ऑपरेशन है - चूंकि वस्तुओं का एक संख्यात्मक भंडार है, वैसे भी यह मूल रूप से दो संकेत बदल रहा है।
बेंजामिन ग्रुएनबाम

यह इस तथ्य के लिए भी इस्तेमाल किया जा सकता है कि यह अन्य त्वरित समाधानों के बीच स्पष्ट रूप से अद्वितीय है, किसी भी गैर-सूचकांक ("स्वयं") गुण को सरणी (यानी, गैर-सकारात्मक-पूर्णांक गुण) के संरक्षण के लिए ...
ब्रेट ज़मीर

लेकिन हम्म, "ऑब्जेक्ट" के लिए यहाँ Array.isArrayलौट रहा trueहै, भले ही instanceof Arrayनहीं ...
ब्रेट ज़मीर

@BrettZamir जो बग की तरह लगता है: D
बेंजामिन ग्रुएनबाम

26

देखकर चौंक गए ना -

console.log(
  Object.assign({}, ['a', 'b', 'c'])
)


{ "first":"a", "second":"b","third":"c" }तय की जा रही चाबियों के साथ बनाने के लिए कोई भी स्मार्ट सुझाव - मुझे एक विनाशकारी की तलाश है
mplungjan

@mplungjan मैं उस मामले में असाइन करने के बजाय कम करने का सुझाव दूंगा। संभवत: एक पुस्तकालय है जो आपको जरूरत पड़ने पर हर अध्यादेश पर विजय प्राप्त करने की अनुमति देगा।
व्यिलियम जुड

मेरा आज एक और मामला था। मैंने इसके बारे में एक प्रश्न पूछना समाप्त कर दिया: stackoverflow.com/questions/62197270/destruct-using-tmarks/…
mplungjan

23

हम एक Array को Object में बदलने के लिए उपयोग Object.assignऔर array.reduceकार्य कर सकते हैं ।

var arr = [{a:{b:1}},{c:{d:2}}] 
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})

console.log(newObj)


यह वही है जिसे मैं देख रहा था। मुझे इंडोल की आवश्यकता नहीं थी, मुझे सरणी को बनाए रखने वाले कुंजी-मूल्य जोड़े में बदलने की आवश्यकता थी।
माइक के।

18

मैंने ऑब्जेक्ट स्प्रेड ऑपरेटर का उपयोग करके समाप्त किया, क्योंकि यह ECMAScript 2015 (ES6) मानक का हिस्सा है।

const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}

एक उदाहरण के रूप में निम्नलिखित फिडल बनाया ।


1
मैं इस के प्रदर्शन के बारे में निश्चित नहीं हूं, लेकिन इतने सारे ऐरे से ऑब्जेक्ट कन्वर्जन के लिए (क्योंकि मैं इसे मानकीकृत करने के लिए अपने सभी कोड के लिए ऑब्जेक्ट का उपयोग करना चाहता हूं), यह शायद सबसे आसान है।
कोई विशेष

यह पहले से मौजूद किसी भी जवाब से बेहतर कैसे है जिसने एक ही समाधान दिया?
डैन डैस्केल्स्कु

17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

आधुनिक जावास्क्रिप्ट में आसान तरीका Object.assign()यह है कि नकल करने के अलावा कुछ भी नहीं करना चाहिए: एक वस्तु से दूसरी वस्तु का मूल्य। हमारे मामले में, Arrayनए को गुण दान करता है {}


यह पहले से मौजूद किसी भी जवाब से बेहतर कैसे है जिसने एक ही समाधान दिया?
डैन डैस्केल्स्कु

डैन डस्केलस्कु ने उस समय मुझे उत्तर मिलाया था जिसके बारे में केवल उपरोक्त उत्तर था, O.assignलेकिन इसमें स्पष्टीकरण का अभाव था। आजकल ऑब्जेक्ट में विनाशकारी सरणी एक तरीका है ( {...array})
अप्पेरियन

13

ES2016 के लिए, ऑब्जेक्ट के लिए ऑपरेटर फैलाएं। नोट: यह ईएस 6 के बाद है और इसलिए ट्रांसपिलर को समायोजित करने की आवश्यकता होगी।

const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"} 


प्रसार ऑपरेटर जवाब पहले से ही 2 साल पहले दिया गया था
डैन डस्केल्सस्कू


10

javascript#forEachएक का उपयोग कर यह कर सकते हैं

var result = {},
    attributes = ['a', 'b','c'];

attributes.forEach(function(prop,index) {
  result[index] = prop;
});

ECMA6 के साथ:

attributes.forEach((prop,index)=>result[index] = prop);

10

Fwiw, एक दूसरे के हाल के दृष्टिकोण नया प्रयोग है Object.fromEntriesके साथ Object.entriesइस प्रकार है:

const arr = ['a','b','c'];
arr[-2] = 'd';
arr.hello = 'e';
arr.length = 17;
const obj = Object.fromEntries(Object.entries(arr));

... जो undefinedया तो के रूप में विरल सरणी आइटम भंडारण से बचने के लिए अनुमति देता हैnull और बरकरार रखता है गैर सूचकांक (जैसे, गैर सकारात्मक-पूर्णांक / गैर-संख्यात्मक) कुंजी।

एक को जोड़ना चाह सकते हैं arr.length, हालांकि, कि शामिल नहीं है:

obj.length = arr.length;


9

यदि आप ES6 का उपयोग कर रहे हैं, तो आप Object.assign और प्रसार ऑपरेटर का उपयोग कर सकते हैं

{ ...['a', 'b', 'c'] }

यदि आपके पास नेस्टेड सरणी है

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))

1
न केवल आपके चर नाम अलग-अलग हैं, लेकिन आपका उदाहरण काम नहीं करेगा, निर्माणकर्ता से मानचित्र बनाने के लिए शुरू में 2d कुंजी-मूल्य सरणी की आवश्यकता है। new Map([['key1', 'value1'], ['key2', 'value2']]);
शैनन होकिन्स

5

एक त्वरित और गंदा:

var obj = {},
  arr = ['a','b','c'],
  l = arr.length; 

while( l && (obj[--l] = arr.pop() ) ){};

मुझे लगता है कि आप परीक्षण करना भूल गए; यह पैदा करता है {0:"c", 1:"b", 2:"a"}। आप या तो unshiftइसके बजाय pop(बेहतर) शुरुआत करना चाहते हैं i=arr.length-1और इसके बजाय गिरावट चाहते हैं।
फ्रॉग्ज

हाँ .. बस इसे बदल दिया है, लेकिन फिर यह कम दिलचस्प हो जाता है: /
Mic

भी कर सकता था l = arr.length, और फिर while (l && (obj[--l] = arr.pop())){}(मुझे एहसास है कि यह पुराना है, लेकिन इसे और भी सरल क्यों नहीं किया जाए)।
Qix - मोनासा

2
@Qix, नाइस शोर्टिंग
Mic

4

त्वरित और गंदा # 2:

var i = 0
  , s = {}
  , a = ['A', 'B', 'C'];

while( a[i] ) { s[i] = a[i++] };

आप अल्पविराम संकेतन का उपयोग क्यों कर रहे हैं?
कॉनर रूहल

3
अगली पंक्ति में अल्पविराम के लिए व्यक्तिगत प्राथमिकता। मुझे यह अंकन पढ़ने में आसान लगता है।
बिंगबॉय

1
यदि सरणी में गलत मान है, तो लूप बंद हो जाएगा। आपको i < a.lengthइसके बजाय जाँच करनी चाहिए a[i]
ओरिओल


3

यहाँ एक पुनरावर्ती कार्य है जो मैंने अभी लिखा है। यह सरल है और अच्छी तरह से काम करता है।

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}

यहाँ एक उदाहरण ( jsFiddle ) है:

var array = new Array();
array.a = 123;
array.b = 234;
array.c = 345;
var array2 = new Array();
array2.a = 321;
array2.b = 432;
array2.c = 543;
var array3 = new Array();
array3.a = 132;
array3.b = 243;
array3.c = 354;
var array4 = new Array();
array4.a = 312;
array4.b = 423;
array4.c = 534;
var array5 = new Array();
array5.a = 112;
array5.b = 223;
array5.c = 334;

array.d = array2;
array4.d = array5;
array3.d = array4;
array.e = array3;


console.log(array);

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}
console.log(convArrToObj(array));

परिणाम: ऑब्जेक्ट के लिए पुनरावर्ती सरणी


वास्तव में अच्छी तरह से काम करता है। धन्यवाद
हनमसाला

यह उच्चतर होना चाहिए, अगर आपके पास है ['a' = '1', 'b' = '2', 'c' = '3']और यह चाहता है कि यह {a: 1, b: 2, c: 3}सही काम करे।
वंजिया

3
.reduce((o,v,i)=>(o[i]=v,o), {})

[डॉक्स]

या अधिक क्रिया

var trAr2Obj = function (arr) {return arr.reduce((o,v,i)=>(o[i]=v,o), {});}

या

var transposeAr2Obj = arr=>arr.reduce((o,v,i)=>(o[i]=v,o), {})

वेनिला जेएस के साथ सबसे छोटा

JSON.stringify([["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[i]=v,o}, {}))
=> "{"0":["a","X"],"1":["b","Y"]}"

कुछ और जटिल उदाहरण

[["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[v[0]]=v.slice(1)[0],o}, {})
=> Object {a: "X", b: "Y"}

इससे भी कम ( function(e) {console.log(e); return e;}= = का उपयोग करके (e)=>(console.log(e),e))

 nodejs
> [[1, 2, 3], [3,4,5]].reduce((o,v,i)=>(o[v[0]]=v.slice(1),o), {})
{ '1': [ 2, 3 ], '3': [ 4, 5 ] }

[/ डॉक्स]


आपने क्या इरादा किया था [/docs]? कोड स्निपेट को निष्पादन योग्य बनाने के लिए यह अधिक उपयोगी होगा।
डैन डस्केल्सस्कू

3

मैं यह बस के साथ करना होगा Array.of()ऐरे में एक रचनाकार के रूप में इसका उपयोग करने की क्षमता है।

नोट 2 फ़ंक्शन का एक जानबूझकर सामान्य फैक्टरी विधि है; इसकी आवश्यकता नहीं है कि इसका मान एरियर निर्माता हो। इसलिए इसे अन्य निर्माणकर्ताओं द्वारा हस्तांतरित या विरासत में दिया जा सकता है जिसे एकल संख्यात्मक तर्क के साथ कहा जा सकता है।

तो हम Array.of()एक फंक्शन को बांध सकते हैं और ऑब्जेक्ट की तरह एक सरणी उत्पन्न कर सकते हैं ।

function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);

Array.of() एक का उपयोग करके भी सरणी उप-क्लासिंग कर सकते हैं


3

यदि आप उपयोग कर सकते हैं Mapया Object.assign, यह बहुत आसान है।

एक सरणी बनाएँ:

const languages = ['css', 'javascript', 'php', 'html'];

नीचे कुंजी के रूप में सूचकांक के साथ एक वस्तु बनाता है:

Object.assign({}, languages)

मैप्स के साथ ऊपर के समान ही दोहराएं

एक सूचकांक आधारित वस्तु {0 : 'css'}आदि में परिवर्तित होता है ...

const indexMap = new Map(languages.map((name, i) => [i, name] ));
indexMap.get(1) // javascript

मान आधारित ऑब्जेक्ट {css : 'css is great'}आदि में कनवर्ट करें ...

const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great

3

किसी वस्तु में वस्तुओं के एरियर को जल्दी से परिवर्तित करने का एक सरल और चुटीला तरीका

function arrayToObject( srcArray ){
    return  JSON.parse( JSON.stringify( srcArray ) );
}

फिर इसे ऐसे ही इस्तेमाल करना ...

var p = [0,2,3,'pork','pie',6];
obj = new arrayToObject( p );
console.log( obj[3], obj[4] )
// expecting `pork pie`

आउटपुट:

pork pie

प्रकार की जाँच:

typeof obj
"object"

और अगर कोई प्रोटोटाइप तरीका नहीं था तो चीजें पूरी नहीं होंगी

Array.prototype.toObject =function(){
    return  JSON.parse( JSON.stringify( this ) );
}

इस तरह का उपयोग:

var q = [0,2,3,'cheese','whizz',6];
obj = q.toObject();
console.log( obj[3], obj[4] )
// expecting `cheese whizz`

आउटपुट:

cheese whizz

* ध्यान दें कि कोई नामकरण दिनचर्या नहीं है, इसलिए यदि आप विशिष्ट नाम रखना चाहते हैं, तो आपको नीचे दिए गए मौजूदा तरीकों का उपयोग करना जारी रखना होगा।


पुराना तरीका

यह आपको उन कुंजियों से एक ऑब्जेक्ट उत्पन्न करने की अनुमति देता है, जिन्हें आप अपने इच्छित ऑर्डर में परिभाषित करते हैं।

Array.prototype.toObject = function(keys){
    var obj = {};
    var tmp = this; // we want the original array intact.
    if(keys.length == this.length){
        var c = this.length-1;
        while( c>=0 ){
            obj[ keys[ c ] ] = tmp[c];
            c--;
        }
    }
    return obj;
};

result = ["cheese","paint",14,8].toObject([0,"onion",4,99]);

console.log(">>> :" + result.onion); "पेंट" आउटपुट करेगा, फ़ंक्शन को समान लंबाई के एरेज़ होने चाहिए या आपको एक खाली ऑब्जेक्ट मिलेगा।

यहाँ एक अद्यतन विधि है

Array.prototype.toObject = function(keys){
    var obj = {};
    if( keys.length == this.length)
        while( keys.length )
            obj[ keys.pop() ] = this[ keys.length ];
    return obj;
};

यह दोनों कुंजी सरणी सामग्री को नष्ट कर देता है और आंतरिक टिप्पणी के बावजूद, मान सरणी (इसकी सामग्री) भी। जावास्क्रिप्ट PHP के साथ अलग से काम करता है जावास्क्रिप्ट स्वचालित रूप से एक वस्तु / सरणी के गुणों पर संदर्भ द्वारा अभिनय करता है।
ब्रेट ज़मीर

नहीं, यह नहीं है, दिनचर्या प्रतियां बनाता है, मूल नहीं छुआ है।
मार्क गिब्लिन

हां, मूल को छुआ गया है। Jsfiddle.net/bRTv7 देखें । सरणी लंबाई दोनों समाप्त हो रही है 0.
ब्रेट ज़मीर

ठीक है, जिस संपादित संस्करण को मैंने अभी-अभी बदला है वह सरणियों को नष्ट नहीं करता है, उस अजीब को ढूंढें जो उसे करना चाहिए था।
मार्क गिब्लिन

1
अपडेट की गई विधि जो पुराने ब्राउज़रों में समर्थित होनी चाहिए क्योंकि JSON ईसीएमए की नई कोड विशेषताओं की तुलना में लंबे समय तक रही है
मार्क जिबलिन

2

let i = 0;
let myArray = ["first", "second", "third", "fourth"];

const arrayToObject = (arr) =>
    Object.assign({}, ...arr.map(item => ({[i++]: item})));

console.log(arrayToObject(myArray));

या उपयोग करें

myArray = ["first", "second", "third", "fourth"]
console.log({...myArray})


2

ES5 - समाधान:

ऐरे प्रोटोटाइप फ़ंक्शन 'पुश' और 'अप्लाई' का उपयोग करके आप ऑब्जेक्ट को एलीमेंट तत्वों के साथ पॉप्युलेट कर सकते हैं।

var arr = ['a','b','c'];
var obj = new Object();
Array.prototype.push.apply(obj, arr);
console.log(obj);    // { '0': 'a', '1': 'b', '2': 'c', length: 3 }
console.log(obj[2]); // c


क्या होगा अगर मैं परिवर्तित करना चाहता हूं{ name: a, div :b, salary:c}
प्रशांत पिंपले

2

अधिक ब्राउज़र समर्थित और ऐसा करने का अधिक लचीला तरीका जो सामान्य लूप का उपयोग कर रहा है , जैसे कुछ:

const arr = ['a', 'b', 'c'],
obj = {};

for (let i=0; i<arr.length; i++) {
   obj[i] = arr[i];
}

लेकिन यह भी आधुनिक तरीका प्रसार ऑपरेटर का उपयोग कर सकता है , जैसे:

{...arr}

या ऑब्जेक्ट असाइन करें :

Object.assign({}, ['a', 'b', 'c']);

दोनों लौटेंगे :

{0: "a", 1: "b", 2: "c"}

1

आप इस तरह एक समारोह का उपयोग कर सकते हैं:

var toObject = function(array) {
    var o = {};
    for (var property in array) {
        if (String(property >>> 0) == property && property >>> 0 != 0xffffffff) {
            o[i] = array[i];
        }
    }
    return o;
};

यह एक विरल सरणियों को अधिक कुशलता से संभालना चाहिए।


1

यहाँ कॉफ़ीस्क्रिप्ट में एक समाधान है

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj

7
क्या है कॉफ़ीस्क्रिप्ट? हम बात कर रहे हैं JS की! : D
m93a

2
यह एक छोटी सी भाषा है जो जावास्क्रिप्ट में संकलित है :)
डेविड

6
Hmph, यह अजीब संकेतन का उपयोग करता है। मुझे प्लेन JS ज्यादा पसंद है।
m93a

2
@ डेविड आप पूरी लाइन को केवल 3 लाइन बनाने के लिए 1 लाइन पर लूप के लिए पूरा कर सकते हैं। :) उदाहरण:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.