我不知道这是否相关,但对于我的实现,以下内容非常有效。在定义空数组之后,它必须通过物理方式循环遍历实际数组,以便递归地声明对象以满足对象和子数组等...
formData.append(key + '[]', []);
因此,在原地使用,整个 FormData 构建如下所示...
function runPostFetchScripts(id, str) {
scripts = str.split('<sc' + 'ript>');
if(scripts.length > 1) {
scripts.splice(0, 1);
one_biggy = "";
for(i = 0; i < scripts.length; ++i) {
scripter = scripts[i].split("</sc" + "ript>");
one_biggy += scripter[0];
}
eval(one_biggy);
}
}
function genericBuildFormData(formData, data, previousKey) {
if(data instanceof File) {
formData.append(previousKey, data);
} else if (data instanceof Object) {
var keys = Object.keys(data);
for(var k = 0; k < keys.length; ++k) {
var key = keys[k];
var value = data[key];
if(previousKey != '') {
key = previousKey + '[' + key + ']';
}
if (!(value instanceof File) && (value instanceof Object) && !(Array.isArray(value))) {
formData.append(key + '[]', []);
genericBuildFormData(formData, value, key);
} else {
if (Array.isArray(value)) {
formData.append(key + '[]', []);
for (var a = 0; a < value.length; ++a) {
genericBuildFormData(formData, value[a], key + '[' + a + ']');
}
} else {
formData.append(key, value);
}
}
}
} else {
formData.append(previousKey, data);
}
}
function genericAjaxCall(GetPost, FullUrl, PostParams, Container, id, callback) {
var GET_POST = GetPost.toUpperCase();
var jacks = {
url: FullUrl,
type: GET_POST,
async: true,
processData: false,
contentType: false,
success: function(strResult) {
populateContainer = (Container ? document.getElementById(Container) : false);
if(populateContainer) {
populateContainer.innerHTML = strResult;
if(callback != null) {
window.setTimeout(function() {
callback(id, strResult);
}, 100);
}
} else {
if(callback != null) {
window.setTimeout(function() {
callback(id, strResult);
}, 100);
}
}
},
error: function(jqXHR, textStatus, errorThrown) {
populateContainer = document.getElementById(Container);
if(populateContainer) {
populateContainer.innerHTML = "Error: " + textStatus + " - " + errorThrown;
} else {
if(callback != null) {
window.setTimeout(function() {
callback(id, null, 'Error: ' + textStatus + ' - ' + errorThrown);
}, 100);
} else {
console.log('Error: ' + textStatus + ' - ' + errorThrown);
}
}
}
};
if(GET_POST == "POST") {
var myFormData = new FormData();
genericBuildFormData(myFormData, PostParams, '');
jacks.processData = false;
jacks.contentType = false;
jacks.data = myFormData;
}
$.ajax(jacks);
}
而调用代码看起来像这样(它是递归的,因此在考虑发送到genericBuildFormData函数的参数时请记住)...
var myFormData = new FormData();
genericBuildFormData(myFormData, PostParams, '');
在 Chrome 的 "网络标头" 中查看提交时,生成的数据大致如下...
additional[]:
additional[0]: null
additional[1][id]: 7715
additional[1][ex]: Permanent Exclusion
additional[1][mi]: 1
additional[2]: null
additional[3]: null
additional[4]: null
...其中数组元素0、2、3、4为空,元素1是一个嵌入式对象。
希望这可以帮助到您。Shalom。