2009-07-13 13 views
11

में एक वस्तु में मूल्यों सरणी मेरे पास है:मर्ज कुंजी सरणी और जावास्क्रिप्ट

var keys = [ "height", "width" ]; 
var values = [ "12px", "24px" ]; 

और मैं यह इस वस्तु में तब्दील करना चाहते हैं:

{ height: "12px", width: "24px" } 

अजगर में, वहाँ सरल मुहावरा है dict(zip(keys,values))। क्या jQuery या सादे जावास्क्रिप्ट में कुछ समान है, या क्या मुझे यह लंबा रास्ता तय करना है?

उत्तर

13

सरल जे एस समारोह होगा:

function toObject(names, values) { 
    var result = {}; 
    for (var i = 0; i < names.length; i++) 
     result[names[i]] = values[i]; 
    return result; 
} 
बेशक आप भी वास्तव में जिप, आदि के रूप में जे एस उच्च आदेश प्रकार जो इन कार्यात्मक-भाषा-वाद आसान बनाने का समर्थन करता है जैसे कार्यों को लागू कर सकता है के

: डी

+3

यह लंबा तरीका है, फिर :( – itsadok

+0

यदि नामों की एक ही कुंजी है, तो यह फ़ंक्शन विफल हो जाएगा। – user1927627

2
function combineObject(keys, values) 
{ 
    var obj = {}; 
    if (keys.length != values.length) 
     return null; 
    for (var index in keys) 
     obj[keys[index]] = values[index]; 
    return obj; 
}; 


var your_obj = combine(your_keys, your_values); 
+0

हे, मैं तुम्हें तय यह इतना टिप्पणी है, जो आप तो जवाब दिया हटाया देखा करने के लिए - async वार्तालाप के लिए hurray: डी ऑब्जेक्ट को बदलने के रूप में आपको नए ऑब्जेक्ट से भी बचना चाहिए, लेकिन {} को उत्पत्ति का उपयोग करने के रूप में spec'd किया गया है एल ऑब्जेक्ट कन्स्ट्रक्टर। – olliej

+0

फ़ंक्शन अभी भी गलत है। combineObject (["ऊंचाई", "चौड़ाई"], ["12px", "24px"])। ऊंचाई गलत तरीके से "24px" देता है। –

+0

धन्यवाद मैंने इसे आपकी टिप्पणी के अनुसार तय कर लिया है, लेकिन मुझे यकीन नहीं है कि यह एक मुद्दा हो सकता है, क्योंकि जब कोई ऑब्जेक्ट को ऑब्जेक्ट पर बदल देता है तो हो सकता है कि आपके पास सभी ऑब्जेक्ट्स पर निहित होना बेहतर हो। –

0

jQuery-Utils project में, ArrayUtils मॉड्यूल में एक ज़िप कार्य लागू किया गया है।

//... 
zip: function(object, object2, iterator) { 
    var output = []; 
    var iterator = iterator || dummy; 
     $.each(object, function(idx, i){ 
     if (object2[idx]) { output.push([i, object2[idx]]); } 
    }); 
    return output; 
} 
//... 
+2

हम्म, लेकिन फिर आप टुपल्स की सरणी के साथ क्या करते हैं? – itsadok

1

आप ऑब्जेक्ट में कुंजी-मूल्य जोड़े को मैप करने के लिए reduce() फ़ंक्शन का उपयोग कर सकते हैं।

/** 
 
* Apply to an existing or new object, parallel arrays of key-value pairs. 
 
* 
 
* @param {string[]} keys  - List of keys corresponding to their accociated values. 
 
* @param {object[]} vals  - List of values corresponding to their accociated keys. 
 
* @param {object} [ref={}] - Optional reference to an existing object to apply to. 
 
* 
 
* @returns {object} - The modified or new object with the new key-value pairs applied. 
 
*/ 
 
function toObject(keys, vals, ref) { 
 
    return keys.length === vals.length ? keys.reduce(function(obj, key, index) { 
 
    obj[key] = vals[index]; 
 
    return obj; 
 
    }, ref || {}) : null; 
 
} 
 

 
var keys = [ "height" , "width" ]; 
 
var values = [ "12px" , "24px" ]; 
 

 
document.body.innerHTML = '<pre>' + JSON.stringify(toObject(keys, values), null, 2) + '</pre>';

1

एक वैकल्पिक समाधान है, पहले ही उल्लेख नहीं के रूप में मुझे लगता है कि:

var result = {}; 
    keys.forEach((key, idx) => result[key] = values[idx]); 
0

अजीब और बदसूरत लेकिन छोटे

यह नहीं है ... एक फैलाओ लेकिन सिर्फ किक्स के लिए।

let arr1 = ['key1', 'key2', 'key3']; 
let arr2 = ['1', '2', '3']; 
let obj = (((o,a,b)=>(a.forEach((c,i)=>o[c]=b[i])||o)))({}, arr1, arr2); 

https://jsfiddle.net/x78gy4yu/

0

आप यह कर सकते हैं आसानी से जे एस ES 6 नई सुविधा का उपयोग कर:

var keys = [ "height", "width" ]; 

var values = [ "12px", "24px" ]; 

var combineObject = { 
[keys.shift()] : values .shift(), 
[keys.shift()] : values .shift() 
}; 
console.log(combineObject); // { height: '12px', width: '24px' } 
+0

यह केवल तभी काम करता है जब आप अग्रिम में कुंजी की संख्या जानते हैं – itsadok

+0

हां। स्थैतिक तरीका –

संबंधित मुद्दे