Предложение
kgiannakakis обойти карту было хорошей отправной точкой, хотя я не чувствую, что это считается ответом на мой первоначальный вопрос. После нескольких часов стука головы я согласился на это, что позволяет вам сериализовать элементы на основе настраиваемого атрибута (я не хотел соглашаться на необходимость использовать атрибут 'name' в моих элементах формы, который требуется jQuery ). Я также начал использовать библиотеку JSON из json.org для того, чтобы структурировать объект, который я создаю. Функция serializeToJSON моего плагина - это то, что я искал в качестве ответа на мой вопрос, остальное просто exta.
Примечание : это для клиента, поэтому имена и атрибуты 'CustomXXX' были заменены тем, что они на самом деле
jQuery.fn.extend({
serializeCustomPropertyArray: function() {
return this.map(function() {
return this.elements ? jQuery.makeArray(this.elements) : this;
}).filter(function() {
return jQuery(this).attr('CustomAttribute') &&
(this.checked || /select|textarea/i.test(this.nodeName) ||
/text|hidden|password|search/i.test(this.type));
}).map(function(i, elem) {
var val = jQuery(this).val();
return val == null ? null : jQuery.isArray(val) ?
jQuery.map(val, function(val, i) {
return { name: jQuery(elem).attr('CustomAttribute'), value: val };
}) : { name: jQuery(elem).attr('CustomAttribute'), value: val };
}).get();
},
serializeToJSON: function() {
var objectMap = this.serializeCustomPropertyArray();
var objectJson = new Object;
jQuery.each(objectMap, function() {
objectJson[this.name] = (this.value !== null) ? this.value : 'null';
});
return JSON.stringify(objectJson);
}
});
Это можно назвать как:
$('#fields').find(':input[CustomGroup="Months"]').serializeToJSON();
Предполагается, что ваш документ выглядит примерно так:
<div id="fields">
<input type="checkbox" CustomGroup="Months" CustomAttribute="January" />January<br />
<input type="checkbox" CustomGroup="Months" CustomAttribute="February" />February<br />
...
</div>
Построенный JSON выглядит следующим образом:
{ January: 'on', February: 'on', ... }