2009-04-10 39 views
14

Tôi đang cố gắng chuyển một số dữ liệu qua số $.post() của jQuery và tôi đang gặp một số vấn đề, những gì tôi chỉ có thể phân loại là đánh giá biến trong bản đồ dữ liệu. Cho phép có được với nó:Đánh giá biến Javascript trong bản đồ

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

Kết quả cuối cùng là một POST với các giá trị sau:

// Actual result 
field = barVar 
fooString = barString 

// Expected result  
foo = barVar 
fooString = barString 

tôi mong đợi "lĩnh vực" được đánh giá là "foo" biến trong dữ liệu bản đồ, nhưng không phải vậy. Những gì tôi đã có thể nhận ra là các dấu nháy đơn trên "khóa" là tùy chọn, do đó bỏ chúng ra không gây ra biến để đánh giá.

Tôi cũng đã thử các sau cho tiếng cười khúc khích với số tiền may mắn:

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

tôi stumped. Cảm ơn vì bất kỳ sự giúp đỡ nào mà bạn có thể cung cấp hoặc thậm chí chỉ là "không", vì vậy tôi có thể tiếp tục cuộc sống của mình, an toàn trong kiến ​​thức một người thông thạo hơn có lưng tôi sẽ được đánh giá cao. :)

Trả lời

2

Đây là một câu trả lời có thể.

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

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

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

// Result 
fooVar = barVar 
fooString = barString  

Mặc dù, tôi vẫn tò mò nếu điều này có thể được thực hiện nội tuyến (như trong ví dụ ban đầu) thay vì xây dựng bản đồ trước.

4

Chính xác, một "bản đồ" (đối tượng) Javascript không đánh giá các khóa của nó. Nếu bạn cần phải đánh giá các phím, bạn có thể làm điều đó như vậy:

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

Thậm chí nếu có tồn tại một cách để cấu trúc nội tuyến này (như bạn hy vọng cho here), Bạn nên làm những gì bạn đang sau bằng cách xây dựng các đối tượng trước - xem this Encosia article

-1

Nếu bạn đang đặt trên làm việc đó trong một biểu thức duy nhất, bạn có thể viết một hàm helper như sau (chưa được kiểm tra):

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

Nhưng khi sử dụng một đối tượng theo nghĩa đen, không, không có cách nào để sử dụng giá trị của biểu thức dưới dạng khóa. Các thuộc tính phải được cung cấp dưới dạng chữ số, chuỗi ký tự hoặc số nhận dạng hợp lệ (xem trang 41-42 của số ECMAscript spec).

Các vấn đề liên quan