2009-07-13 20 views

Respuesta

13

función JS simple sería:

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

Por supuesto también se puede aplicar en la práctica funciones como zip, etc como JS soporta tipos de orden superior que hacen de estos funcionales-language-ismos fáciles: D

+3

El largo camino es, entonces :( – itsadok

+0

Si los nombres tienen la misma clave, esta función fallará. – 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

je, te vi arreglaste lo que elimina el comentario, que luego respondió para - hurrah para la conversación asíncrona: D También debe evitar el nuevo objeto como objeto se puede cambiar, pero {} se especifica como el uso de la origina l constructor de objetos. – olliej

+0

La función sigue siendo incorrecta. combineObject (["height", "width"], ["12px", "24px"]). height incorrectamente devuelve "24px". –

+0

Gracias, lo he arreglado de acuerdo con su comentario, pero no estoy seguro de que eso pueda ser un problema, ya que una vez que alguien cambia el objeto, es a propósito así que tal vez sea mejor estar implícito en todos los objetos que tenga. –

0

En el jQuery-Utils project, el módulo ArrayUtils tiene una función de zip implementada.

//... 
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, pero ¿qué haces con la matriz de tuplas? – itsadok

1

Se podría utilizar una función reduce() para mapear los pares clave-valor a un objeto.

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

uso lodash.

_.zipObject

Ejemplo

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

Como una solución alternativa, no se ha mencionado que pienso:

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

raro y feo, pero pequeña

Este no es el ... extendido, sino solo por las patadas.

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

Usted puede hacer esto fácilmente usando JS Es 6 nueva característica:

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

Esto solo funciona si sabes el número de claves por adelantado – itsadok

+0

sí. Manera estática –

Cuestiones relacionadas