परिवर्तित करने का सबसे अच्छा तरीका क्या है:
['a','b','c']
सेवा:
{
0: 'a',
1: 'b',
2: 'c'
}
_.keyBy
(पूर्व में _.indexBy
): lodash.com/docs#keyBy
_.toPlainObject
। Ex:var myObj = _.toPlainObject(myArr)
परिवर्तित करने का सबसे अच्छा तरीका क्या है:
['a','b','c']
सेवा:
{
0: 'a',
1: 'b',
2: 'c'
}
_.keyBy
(पूर्व में _.indexBy
): lodash.com/docs#keyBy
_.toPlainObject
। Ex:var myObj = _.toPlainObject(myArr)
जवाबों:
ECMAScript 6 आसानी से पॉलीफिल करने योग्य है Object.assign
:
Object.assign()
विधि लक्ष्य वस्तु के लिए एक या अधिक स्रोत वस्तुओं से सभी गणनीय खुद गुण के मूल्यों की प्रतिलिपि करने के लिए किया जाता है। यह लक्ष्य वस्तु को लौटा देगा।
Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}
length
सरणी की अपनी संपत्ति की प्रतिलिपि नहीं बनाई गई है क्योंकि यह गणना योग्य नहीं है।
इसके अलावा, आप उसी परिणाम को प्राप्त करने के लिए ES6 स्प्रेड सिंटैक्स का उपयोग कर सकते हैं :
{ ...['a', 'b', 'c'] }
{ ...[sortedArray]}
इस तरह एक समारोह के साथ:
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()
काम करता है।
[]
यदि आप संख्यात्मक संपत्ति कुंजी और "लंबाई" संपत्ति का उपयोग नहीं करने जा रहे हैं , तो जावास्क्रिप्ट में, वास्तव में कोई ऐरे उदाहरण ( ) नहीं है।
const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
आप एक संचायक उर्फ का उपयोग कर सकते हैं 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
, reduce
1-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)।
मोज़िला द्वारा एक डिफ़ॉल्ट कार्यान्वयन देखें ।
यदि आप jquery का उपयोग कर रहे हैं:
$.extend({}, ['a', 'b', 'c']);
{0: 'a', 1: 'b', 2: 'c'}
है जो अपेक्षित परिणाम है।
पूर्णता के लिए, ECMAScript 2015 (ES6) का प्रसार। या तो ट्रांसपिलर (बैबल) या कम से कम ES6 चलाने वाले वातावरण की आवश्यकता होगी।
console.log(
{ ...['a', 'b', 'c'] }
)
मैं शायद इसे इस तरह से लिखूंगा (चूंकि बहुत कम ही मुझे हाथ में अंडरस्कोर लाइब्रेरी नहीं होगी):
var _ = require('underscore');
var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }
obj=_.extend({},a);
काम करेगा। इसके अलावा, यदि आप सरणियों के माध्यम से पुनरावृत्ति कर रहे हैं तो मैं कहूंगा कि _.each
इससे अधिक उपयुक्त होगा _.map
। सभी के सभी, यह कई स्तरों पर एक अच्छा जवाब नहीं है।
यहाँ पूर्णता के लिए एक 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
है कि बहुत बेहतर है ।
Array.isArray
लौट रहा true
है, भले ही instanceof Array
नहीं ...
देखकर चौंक गए ना -
console.log(
Object.assign({}, ['a', 'b', 'c'])
)
{ "first":"a", "second":"b","third":"c" }
तय की जा रही चाबियों के साथ बनाने के लिए कोई भी स्मार्ट सुझाव - मुझे एक विनाशकारी की तलाश है
हम एक 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)
मैंने ऑब्जेक्ट स्प्रेड ऑपरेटर का उपयोग करके समाप्त किया, क्योंकि यह ECMAScript 2015 (ES6) मानक का हिस्सा है।
const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}
एक उदाहरण के रूप में निम्नलिखित फिडल बनाया ।
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}
आधुनिक जावास्क्रिप्ट में आसान तरीका Object.assign()
यह है कि नकल करने के अलावा कुछ भी नहीं करना चाहिए: एक वस्तु से दूसरी वस्तु का मूल्य। हमारे मामले में, Array
नए को गुण दान करता है {}
।
O.assign
लेकिन इसमें स्पष्टीकरण का अभाव था। आजकल ऑब्जेक्ट में विनाशकारी सरणी एक तरीका है ( {...array}
)
ES2016 के लिए, ऑब्जेक्ट के लिए ऑपरेटर फैलाएं। नोट: यह ईएस 6 के बाद है और इसलिए ट्रांसपिलर को समायोजित करने की आवश्यकता होगी।
const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"}
पांच साल बाद, एक अच्छा तरीका है :)
Object.assign
ECMAScript 2015 में पेश किया गया था।
Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}
javascript#forEach
एक का उपयोग कर यह कर सकते हैं
var result = {},
attributes = ['a', 'b','c'];
attributes.forEach(function(prop,index) {
result[index] = prop;
});
ECMA6 के साथ:
attributes.forEach((prop,index)=>result[index] = prop);
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;
आप प्रसार ऑपरेटर का उपयोग कर सकते हैं
x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
यदि आप ES6 का उपयोग कर रहे हैं, तो आप Object.assign और प्रसार ऑपरेटर का उपयोग कर सकते हैं
{ ...['a', 'b', 'c'] }
यदि आपके पास नेस्टेड सरणी है
var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))
new Map([['key1', 'value1'], ['key2', 'value2']]);
एक त्वरित और गंदा:
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
और इसके बजाय गिरावट चाहते हैं।
l = arr.length
, और फिर while (l && (obj[--l] = arr.pop())){}
(मुझे एहसास है कि यह पुराना है, लेकिन इसे और भी सरल क्यों नहीं किया जाए)।
त्वरित और गंदा # 2:
var i = 0
, s = {}
, a = ['A', 'B', 'C'];
while( a[i] ) { s[i] = a[i++] };
i < a.length
इसके बजाय जाँच करनी चाहिए a[i]
।
Lodash 3.0.0 के अनुसार आप _.toPlainObject का उपयोग कर सकते हैं
var obj = _.toPlainObject(['a', 'b', 'c']);
console.log(obj);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
यहाँ एक पुनरावर्ती कार्य है जो मैंने अभी लिखा है। यह सरल है और अच्छी तरह से काम करता है।
// 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}
सही काम करे।
.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]
? कोड स्निपेट को निष्पादन योग्य बनाने के लिए यह अधिक उपयोगी होगा।
मैं यह बस के साथ करना होगा Array.of()
। ऐरे में एक रचनाकार के रूप में इसका उपयोग करने की क्षमता है।
नोट 2 फ़ंक्शन का एक जानबूझकर सामान्य फैक्टरी विधि है; इसकी आवश्यकता नहीं है कि इसका मान एरियर निर्माता हो। इसलिए इसे अन्य निर्माणकर्ताओं द्वारा हस्तांतरित या विरासत में दिया जा सकता है जिसे एकल संख्यात्मक तर्क के साथ कहा जा सकता है।
तो हम Array.of()
एक फंक्शन को बांध सकते हैं और ऑब्जेक्ट की तरह एक सरणी उत्पन्न कर सकते हैं ।
function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);
Array.of()
एक का उपयोग करके भी सरणी उप-क्लासिंग कर सकते हैं ।
यदि आप उपयोग कर सकते हैं 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
किसी वस्तु में वस्तुओं के एरियर को जल्दी से परिवर्तित करने का एक सरल और चुटीला तरीका
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;
};
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})
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}
अधिक ब्राउज़र समर्थित और ऐसा करने का अधिक लचीला तरीका जो सामान्य लूप का उपयोग कर रहा है , जैसे कुछ:
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"}
आप इस तरह एक समारोह का उपयोग कर सकते हैं:
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;
};
यह एक विरल सरणियों को अधिक कुशलता से संभालना चाहिए।
यहाँ कॉफ़ीस्क्रिप्ट में एक समाधान है
arrayToObj = (arr) ->
obj = {}
for v,i in arr
obj[i] = v if v?
obj
obj[i] = v for v,i in arr when v?