2009-04-10 11 views
14

Estoy tratando de pasar algunos datos a través del $.post() de jQuery y estoy teniendo algunos problemas con lo que solo puedo clasificar como evaluación de variables en el mapa de datos. Vamos a ello:Evaluación de variable de Javascript en un mapa

var field = 'fooVar'; 
var value = 'barVar'; 
$.post('/path/to/url', { field:value, 'fooString':'barString' }); 

El resultado final es un POST con los siguientes valores:

// Actual result 
field = barVar 
fooString = barString 

// Expected result  
foo = barVar 
fooString = barString 

que esperaba "campo" para ser evaluado como el "foo" variable en el mapa de datos, pero no lo es. Lo que he podido discernir es que las comillas simples en la "clave" son opcionales, por lo tanto, omitirlas no hace que se evalúe la variable.

también he intentado lo siguiente para la risa con la cantidad de suerte:

$.post('/path/to/url', { "'" + field + "'":value, 'fooString':'barString' }); 
$.post('/path/to/url', { eval(field):value, 'fooString':'barString' }); 

estoy perplejo. Gracias por cualquier ayuda que pueda brindar o incluso por un "no" rotundo, así puedo seguir con mi vida, seguro sabiendo que alguien más versado me apreciará la espalda. :)

Respuesta

2

Esta es una posible respuesta.

var field = 'fooVar'; 
var value = 'barVar' 

var data = { fooString:'barString' } 
data[field] = value; 

$.post('/path/to/url', data); 

// Result 
fooVar = barVar 
fooString = barString  

Sin embargo, todavía estoy ansioso por ver si esto se puede hacer en línea (como en el ejemplo inicial) que está construyendo el mapa de antemano.

4

Correcto, un "mapa" Javascript (objeto) no evalúa sus claves. Si es necesario evaluar las llaves, puede hacerlo de esta manera:

var key = 'name'; 
var value = 'john'; 
var options = {key: value}; // translates to "key=john" 

options[key] = value; // translates to "name=john" 

$.post('path', options); 
10
var field = 'fooVar'; 
var value = 'barVar'; 
var postData = {}; 
postData[field] = value; 
postData['fooString'] = 'barString'; 
$.post('/path/to/url', postData); 

Aunque sí que existe una manera de estructurar esta línea (como usted espera para here), Es mejor que hacer lo lo que busca es mediante la construcción del objeto de antemano - ver this Encosia article

-1

Si ya estás en hacerlo en una sola expresión, se podría escribir una función de ayuda como el siguiente (no probado):

function objectFromPairs() { 
    var o = {}; 
    for (var i = 0; i < arguments.length; i += 2) { 
     o[arguments[i]] = arguments[i+1]; 
    } 
    return o; 
} 

$.post('/path/to/url', objectFromPairs(field, value, 'fooString', 'barString')); 

Pero en lo que respecta al uso de un objeto literal, no, no hay forma de usar el valor de una expresión como clave. Las propiedades se deben dar como literales numéricos, literales de cadena o identificadores válidos (consulte la página 41-42 del ECMAscript spec).

Cuestiones relacionadas