2009-07-13 9 views

Répondre

13

fonction simple JS serait:

function toObject(names, values) { 
    var result = {}; 
    for (var i = 0; i < names.length; i++) 
     result[names[i]] = values[i]; 
    return result; 
} 

Bien sûr, vous pouvez également mettre en œuvre effectivement des fonctions comme zip, etc comme JS prend en charge les types d'ordre supérieur qui rendent ces-langage fonctionnel-ismes facile: D

+3

Le long chemin, puis :( – itsadok

+0

Si les noms ont la même clé, cette fonction échouera – 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

heh, je vous ai vu fixe si retiré le commentaire qui vous a ensuite répondu to - hourra pour la conversation asynchrone: D Vous devriez également éviter de nouveaux objets car l'objet peut être changé, mais {} est spécifié comme utilisant l'origina l Constructeur d'objet. – olliej

+0

La fonction est toujours incorrecte. combineObject (["height", "width"], ["12px", "24px"]). height renvoie incorrectement "24px". –

+0

Merci de l'avoir corrigé en fonction de votre commentaire, mais je ne suis pas sûr que cela puisse être un problème, car une fois que quelqu'un a modifié l'objet, c'est peut-être mieux d'être impliqué sur tous les objets que vous aurez. –

0

Dans le jQuery-Utils project, le module ArrayUtils dispose d'une fonction de compression implémentée.

//... 
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

Hmm, mais alors que faites-vous avec le tableau de tuples? – itsadok

1

Vous pouvez utiliser une fonction reduce() pour cartographier les paires clé-valeur à un objet.

/** 
 
* 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>';

9

utilisation lodash.

_.zipObject

Exemple

_.zipObject(['a', 'b'], [1, 2]); 
// ➜ { 'a': 1, 'b': 2 } 
1

En tant que solution de rechange, pas déjà mentionné, je pense:

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

bizarre et laid mais petit

Ce n'est pas le ... répandre un mais juste pour les coups de pied.

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

Vous pouvez le faire facilement en utilisant Js ES 6 nouvelle fonctionnalité:

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

Cela ne fonctionne que si vous connaissez le nombre de clés à l'avance – itsadok

+0

oui façon statique –

Questions connexes