मैं जावास्क्रिप्ट में ऑब्जेक्ट की सरणी को एक ऑब्जेक्ट में कैसे बदलूं?


102

मेरे पास वस्तुओं की एक सरणी है:

[ 
  { key : '11', value : '1100', $$hashKey : '00X' },
  { key : '22', value : '2200', $$hashKey : '018' }
];

मैं इसे जावास्क्रिप्ट द्वारा निम्नलिखित में कैसे बदलूं?

{
  "11": "1000",
  "22": "2200"
}

4
[{key:"11", value:"1100"}, {key:"22", value:"2200"}].reduce(function(m,v){m[v.key] = v.value; return m;}, {})
डेविड

जवाबों:


52

आप शायद कुछ इस तरह की तलाश कर रहे हैं:

// original
var arr = [ 
  {key : '11', value : '1100', $$hashKey : '00X' },
  {key : '22', value : '2200', $$hashKey : '018' }
];

//convert
var result = {};
for (var i = 0; i < arr.length; i++) {
  result[arr[i].key] = arr[i].value;
}

console.log(result);


2
की जाँच करें FirstOne का जवाब एक आधुनिक दृष्टिकोण के लिए।
टिब्बो

134

छोटे ES6 समाधान की तरह देख सकते हैं:

var arr = [{key:"11", value:"1100"},{key:"22", value:"2200"}];
var object = arr.reduce(
  (obj, item) => Object.assign(obj, { [item.key]: item.value }), {});

console.log(object)

इसके अलावा, यदि आप ऑब्जेक्ट स्प्रेड का उपयोग करते हैं, तो यह इस तरह दिख सकता है:

var object = arr.reduce((obj, item) => ({...obj, [item.key]: item.value}) ,{});

एक और उपाय जो 99% तेज है (jsperf पर परीक्षण किया गया है):

var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});

यहां हम अल्पविराम ऑपरेटर से लाभान्वित होते हैं, यह अल्पविराम से पहले सभी अभिव्यक्ति का मूल्यांकन करता है और अंतिम एक (अंतिम अल्पविराम के बाद) देता है। इसलिए हम objहर बार इसकी नकल नहीं करते , बल्कि इसे नई संपत्ति सौंपते हैं।


2
एक प्यार करता था! var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
सोहेल

यह एक लाइन तेज या पारंपरिक लूप है?
Jeb50

2
@ Jeb50, पारंपरिक लूप सबसे तेज़ है, लेकिन अल्पविराम ऑपरेटर पर ज्यादा नहीं। Object.assign / स्प्रेड ऑपरेटर परिमाण का एक क्रम धीमा है: jsperf.com/comma-operator-js
जोश गेलर

1
आप दूसरी वस्तु फैलाना भूल गए({...obj, ...{[item.key]: item.value}}) ,{});
जूलिया

धन्यवाद, वास्तव में इसे किसी वस्तु में लपेटना आवश्यक नहीं है। मैंने इसे ठीक कर लिया है।
Shevchenko विक्टर

59

मुझे इस कार्य को प्राप्त करने के लिए कार्यात्मक दृष्टिकोण पसंद है:

var arr = [{ key:"11", value:"1100" }, { key:"22", value:"2200" }];
var result = arr.reduce(function(obj,item){
  obj[item.key] = item.value; 
  return obj;
}, {});

नोट: अंतिम कार्य को कम करने के लिए {}प्रारंभिक objमूल्य है, यदि आप प्रारंभिक मूल्य प्रदान नहीं करेंगे, तो पहले arrतत्व का उपयोग किया जाएगा (जो संभवतः अवांछनीय है)।

https://jsfiddle.net/GreQ/2xa078da/


2
और अगर कुंजी गतिशील है?
स्टेफानो सिट्टा

1
ठीक है, आपको पता होना चाहिए कि दी गई वस्तु / वस्तु का कौन सा गुण कुंजी के रूप में उपयोग किया जाना चाहिए और कौन सा मूल्य नहीं? लेकिन अगर हम मानते हैं कि wfirst प्रोप हमेशा कुंजी है और दूसरा मूल्य है जो हम इस तरह से एक कॉलबैक फ़ंक्शन का उपयोग कर सकते हैं: फ़ंक्शन (obj, आइटम) {var keys = item.keys (); obj [मद [चाबियाँ [0]]] = आइटम [कुंजी [0]]; वापसी obj; }
ग्रीक्यू

ऊपर कॉलबैक का सुधार: कोड var obj = arr.reduce (फ़ंक्शन (obj, आइटम) {var keys = Object.keys (आइटम); obj [आइटम [कुंजी [0]]] = आइटम [चाबियाँ [1]]; obj;}, {});
ग्रीको

58

ठीक करने के लिए कोशिश कर रहा है इस जवाब में मैं कैसे जावास्क्रिप्ट में एक वस्तु में वस्तुओं की सरणी में परिवर्तित? ,

यह करना चाहिए:

var array = [
    {key:'k1',value:'v1'},
    {key:'k2',value:'v2'},
    {key:'k3',value:'v3'}
];
var mapped = array .map(item => ({ [item.key]: item.value }) );
var newObj = Object.assign({}, ...mapped );
console.log(newObj );


एक लाइन:

var newObj = Object.assign({}, ...(array.map(item => ({ [item.key]: item.value }) )));


11

आधुनिक जावास्क्रिप्ट का उपयोग करने का एक साफ तरीका इस प्रकार है:

const array = [
  { name: "something", value: "something" },
  { name: "somethingElse", value: "something else" },
];

const newObject = Object.assign({}, ...array.map(item => ({ [item.name]: item.value })));

// >> { something: "something", somethingElse: "something else" }


5

कई लेखकों द्वारा सुझाए गए उत्तरों के आधार पर, मैंने एक JsPref परीक्षण परिदृश्य बनाया। https://jsperf.com/array2object82364

नीचे प्रदर्शन के स्क्रीनशॉट हैं। यह मेरे लिए थोड़ा चौंकाने वाला है, क्रोम परिणाम फ़ायरफ़ॉक्स और किनारे के विपरीत है, यहां तक ​​कि इसे कई बार चलाने के बाद भी।

धार

फ़ायरफ़ॉक्स

क्रोम


2

अंडरस्कोर का उपयोग करना। js :

var myArray = [
  Object { key="11", value="1100", $$hashKey="00X"},
  Object { key="22", value="2200", $$hashKey="018"}
];
var myObj = _.object(_.pluck(myArray, 'key'), _.pluck(myArray, 'value'));

2

अपडेट: दुनिया मुड़ती रही। इसके बजाय एक कार्यात्मक दृष्टिकोण का उपयोग करें।

हेयर यू गो:

var arr = [{ key: "11", value: "1100" }, { key: "22", value: "2200" }];
var result = {};
for (var i=0, len=arr.length; i < len; i++) {
    result[arr[i].key] = arr[i].value;
}
console.log(result); // {11: "1000", 22: "2200"}

यह आश्चर्यजनक रूप से 5 मिनट पहले पोस्ट किए गए उत्तर जैसा दिखता है
अलेक्जेंडर

1
क्योंकि यही आप इस समस्या को हल करते हैं। उदाहरण के लिए नामकरण के बारे में: arrayएक आरक्षित कीवर्ड है, इसलिए लोग arrइसके बजाय उपयोग करते हैं। आदि
पिस्टलर

0

यहां बताया गया है कि कैसे गतिशील रूप से उपरोक्त को एक स्ट्रिंग के रूप में स्वीकार करते हैं और इसे एक वस्तु में बदलते हैं:

var stringObject = '[Object { key="11", value="1100", $$hashKey="00X"}, Object { key="22", value="2200", $$hashKey="018"}]';

function interpolateStringObject(stringObject) {
  var jsObj = {};
  var processedObj = stringObject.split("[Object { ");
  processedObj = processedObj[1].split("},");
  $.each(processedObj, function (i, v) {
      jsObj[v.split("key=")[1].split(",")[0]] = v.split("value=")[1].split(",")[0].replace(/\"/g,'');
  });

  return jsObj
}

var t = interpolateStringObject(stringObject); //t is the object you want

http://jsfiddle.net/3QKmX/1/


0

// original
var arr = [{
    key: '11',
    value: '1100',
    $$hashKey: '00X'
  },
  {
    key: '22',
    value: '2200',
    $$hashKey: '018'
  }
];

// My solution
var obj = {};
for (let i = 0; i < arr.length; i++) {
  obj[arr[i].key] = arr[i].value;
}
console.log(obj)


हालांकि यह इस सवाल का जवाब दे सकता है कि इस मुद्दे को हल करने में मदद करने के बारे में कुछ विवरण जोड़ना बेहतर होगा। कृपया पढ़ें कि मैं और अधिक जानने के लिए एक अच्छा उत्तर कैसे लिखूं
रोशन पिटिगला

0

आप उसके लिए mapKeys lodash फ़ंक्शन का उपयोग कर सकते हैं। कोड की सिर्फ एक लाइन!

कृपया इस पूर्ण कोड नमूने का संदर्भ लें (कॉपी पेस्ट को repl.it या समान में कॉपी करें):

import _ from 'lodash';
// or commonjs:
// const _ = require('lodash');

let a = [{ id: 23, title: 'meat' }, { id: 45, title: 'fish' }, { id: 71, title: 'fruit' }]
let b = _.mapKeys(a, 'id');
console.log(b);
// b:
// { '23': { id: 23, title: 'meat' },
//   '45': { id: 45, title: 'fish' },
//   '71': { id: 71, title: 'fruit' } }

-2
        var obj = [
            {id: 1 , name : 'gaju' , class : 'kv'},
            {id: 2 , name : 'tushar' , class : 'Super'}
        ];

        function conv(obj,arg){
        var temp= {};
        var output= {}
        for(key in obj){
        temp[key] = obj[key];
        };

        var i=0;
        for(key in temp){
        var aa = {};
        var value = temp[key][arg];
        aa[value] = temp[i];
        //console.log(aa[value][arg] );
        output[aa[value][arg]]=  aa[value];
        i++;
        }

       console.log(output); 
        }

calling function 

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