如果值为空,则从对象中删除项目

时间:2013-11-18 18:30:09

标签: javascript

所以我正在使用表单并使用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: ""

4 个答案:

答案 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]将只返回与特定键关联的值。

DEMO


更新

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