在一个映射中评估JavaScript变量

14

我试图通过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' });

我被难住了。谢谢你能提供任何帮助,甚至只要一个坚定的“不”让我可以继续我的生活,安心地知道有更熟悉的人支持我会很感激。:)

4个回答

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

即使存在一种内联的结构方式(就像你在这里所希望的那样),你最好通过事先创建对象来实现你想要的目标-请参阅此Encosia文章


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

这是一个可能的答案。

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

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

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

// Result
fooVar = barVar
fooString = barString    

不过,我仍然好奇是否可以像原始示例中那样内联执行此操作,而无需预先构建地图。


-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 规范第 41-42 页 链接)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接