我试图通过jQuery的$.post()
传递一些数据,我遇到了一些问题,我只能归类为数据映射中的变量评估。让我们来看看:
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
我希望“field”在数据图中被评估为变量“foo”,但事实并非如此。我能够辨别的是“key”上的单引号是可选的,因此将它们排除不会导致变量被评估。
我还尝试了以下几个运气量的笑声:
$.post('/path/to/url', { "'" + field + "'":value, 'fooString':'barString' });
$.post('/path/to/url', { eval(field):value, 'fooString':'barString' });
我很难过。感谢您提供的任何帮助,甚至只是一个坚定的“不”,这样我就可以继续我的生活,知道一个更精通的人,我的背后会受到赞赏。 :)
答案 0 :(得分:10)
var field = 'fooVar';
var value = 'barVar';
var postData = {};
postData[field] = value;
postData['fooString'] = 'barString';
$.post('/path/to/url', postData);
即使存在构建此内联的方法(正如您希望here那样),您最好通过事先构建对象来完成您所做的事情 - 请参阅this Encosia article < / p>
答案 1 :(得分:4)
正确,Javascript“map”(对象)不评估其键。如果你需要评估密钥,你可以这样做:
var key = 'name';
var value = 'john';
var options = {key: value}; // translates to "key=john"
options[key] = value; // translates to "name=john"
$.post('path', options);
答案 2 :(得分:2)
这是一个可能的答案。
var field = 'fooVar';
var value = 'barVar'
var data = { fooString:'barString' }
data[field] = value;
$.post('/path/to/url', data);
// Result
fooVar = barVar
fooString = barString
尽管如此,我仍然很好奇这是否可以内联(比如在原始示例中)而不是事先构建地图。
答案 3 :(得分:-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页)。