Оценка переменных 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).