2009-04-10 108 views
14

我試圖通過jQuery的$.post()傳遞一些數據,我遇到了一些問題,我只能分類爲數據映射中的變量評估。讓得到它:在地圖中的Javascript變量評估

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

最終結果是具有以下值的POST:

// Actual result 
field = barVar 
fooString = barString 

// Expected result  
foo = barVar 
fooString = barString 

我預期的「場」被評價爲在數據圖中的變量「foo」的,但不是這樣。我能夠辨別的是,「鍵」上的單引號是可選的,因此將它們留出不會導致對變量進行評估。

我也試圖與運氣的量笑聲如下:

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

我難倒。感謝您提供的任何幫助,甚至只是一個堅定的「不」,所以我可以繼續我的生活,安全的知識更熟悉我的背後的人會不勝感激。 :)

回答

2

這是一個可能的答案。

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

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

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

// Result 
fooVar = barVar 
fooString = barString  

雖然,我還是好奇這是否可以(在最初的例子等)進行在線完成,而建築地圖事前。

4

正確,Javascript「地圖」(對象)不評估其密鑰。如果您需要評估鍵,你可以做到這一點,像這樣:

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); 

即使確實存在着一個方法來組織這個內嵌(如你希望here),你最好不要做什麼你之後通過預先建立的對象 - 見this Encosia article

-1

如果你在一個表達式做設定,你可以寫這樣(未經測試)的輔助功能:

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')); 

但是,就使用對象字面而言,不,無法將表達式的值用作關鍵字。屬性必須以數字文字,字符串文字或有效標識符的形式給出(請參閱ECMAscript spec的第41-42頁)。