所以我正在使用表单并使用serializeArray()
来获取所有表单数据。有10个文本输入。我想要做的是跳过返回空结果的表单或具有“”值的表单。这是我想出的,它返回带有“”或正确结果的表单的索引。
$("#" + forms).on("submit", function(event) {
var allData = $(this).serializeArray();
event.preventDefault();
for (var key in allData) {
if (allData[key].value === "") {
allData.splice(key, 1);
}
}
});
但是当我添加allData.splice(key, 1);
时,它不会删除带有“”的所有值。我基本上想要删除任何没有值的输入。
目标的结构如下:
[0]
name: "emailone",
value "some@email.com"
[1]
name: "passwordone",
value: "123asd"
[2]
name: "emailtwo",
value "another@email.com"
[3]
name: "passwordtwo",
value: "asd123"
[4]
name: "emailthree",
value ""
[5]
name: "passwordthree",
value: ""
答案 0 :(得分:2)
发生这种情况是因为您在遍历数组时正在改变数组......
当key
为4并且值为''时,您删除该元素(成功),但是当您拼接数组时,它会变得更小..所以位置处的元素5现在是4.你的key
变量增加到5,但现在你的数组中没有元素5 ..
你需要向后遍历
$("#" + forms).on("submit", function(event) {
var allData = $(this).serializeArray();
event.preventDefault();
for (var key = allData.length-1; key >= 0 ; key--) {
if (allData[key].value === "") {
allData.splice(key, 1);
}
}
});
答案 1 :(得分:1)
通过在迭代时拼接数组,您可能会意外跳过值 - 在这种情况下,通过删除索引4处的值,可以将以下值的索引减1。循环比增量为5,并跳过从第五个索引开始的值。
其他一些答案已经找到了合理的方法来解决这个问题。如果您正在使用较新版本的JavaScript或使用jQuery或下划线等库,则可以选择执行此操作:
allData = allData.filter(function(e) {
return e.value !== "";
});
使用jQuery,可以写成
allData = $.grep(allData, function(e) {
return e.value !== "";
});
以下划线:
allData = _.filter(allData, function(e) {
return e.value !== "";
});
答案 2 :(得分:0)
您只需使用delete来满足您的需求,
for (var key in allData) {
if (allData[key].value === "") {
delete allData[key];
}
}
另外,您不需要通过此 toallData[key].value
显式获取值,toallData[key]
将只返回与特定键关联的值。
for (var i=0; i < allData.length ; I++) {
if (allData[i].value === "") {
allData.splice(i, 1);
i--;
}
}
每次从数组中删除对象时,都应decrement
index
的值{。}}。
答案 3 :(得分:0)
var arrLength = allData.length, i, cleanArray = [], serializedArr;
for(i = 0; i < arrLength; i += 1{
if(allData[i] != ""){
cleanArray.push(allData[i]);
}
}
serializedArr = cleanArray.serializeArray();