Оценка переменных Javascript на карте

Я пытаюсь передать некоторые данные через 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

Я ожидал, что "поле" будет оцениваться как переменная "foo" в карте данных, но это не так. То, что я смог различить, состоит в том, что одинарные кавычки на "ключ" являются необязательными, поэтому их исключение не приводит к оценке переменной.

Я также попробовал следующее для хихиканья с удачей:

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

Я в тупике. Спасибо за любую помощь, которую вы можете предоставить, или даже просто "нет", чтобы я мог продолжить свою жизнь, в безопасности, если кто-то, кто больше разбирается в моей речи, будет оценен по достоинству.:)

Ответы

Ответ 1

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

Даже если существует способ структурирования этого встроенного (как вы надеетесь для здесь), вам лучше делать то, что вам нужно, создав объект заранее - см. эта статья Encosia

Ответ 2

Правильно, 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);

Ответ 3

Это один из возможных ответов.

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

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

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

// Result
fooVar = barVar
fooString = barString    

Хотя, мне все еще интересно, если это можно сделать inline (как в исходном примере), скорее, построив карту заранее.

Ответ 4

Если вы настроены на выполнение этого действия в одном выражении, вы можете написать вспомогательную функцию, например следующую (непроверенную):

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

Но поскольку использование литерала объекта идет, нет, нет способа использовать значение выражения в качестве ключа. Свойства должны быть указаны как числовые литералы, строковые литералы или действительные идентификаторы (см. Стр. 41-42 спецификация ECMAscript).