我的JSON数组只能删除一个元素

时间:2013-12-05 21:26:15

标签: javascript jquery json

我的删除功能遇到了一些问题。第一次删除没有问题,但如果我尝试删除或添加另一个后它不起作用。我认为必须是......我的阵列,但是什么?我看到.live功能,但它没有用。

      var data = [{
          title: "40 männlich Jungfrau sucht",
          director: "Judd Apatow",
          year: 2005,
          playTime: 116,
          fsk: 14
      }, {
          title: "Pulp Ficiton",
          director: "Quentin Tarantino",
          year: 1994,
          playTime: 148,
          fsk: 16
      }, {
          title: "Inglourious Basterds",
          director: "Quentin Tarantino",
          year: 2009,
          playTime: 148,
          fsk: 16
      }];

      $('button').click(function () {
          for (var e in data) {
              if (data[e].title == $(this).attr('value')) {
                  delete data[e];
              }
          }

          drawTable(data);
      });

3 个答案:

答案 0 :(得分:2)

问题是 for 为你提供了一个索引,而不是实际的对象,即:

for (i in data) console.log(i); //  0, 1, 2

所以你得到的问题是,在第一次删除之后,下一个索引不再有效。为了解决这个问题,你可以向后迭代:

for (var i = data.length-1 ; i>=0 ; i--) {
    if (data[i].title == $(this).attr('value')) {
        delete data[i];
    }
}

答案 1 :(得分:2)

您有一个对象数组,不要使用for in循环进行迭代。您的delete也会删除整个数组索引,如果需要,请使用splice,如果没有,请定位密钥:

for (var i = 0; i < data.length; i++) {
    if (data[i].title == $(this).attr('value')) {
        data.splice(i, 1); //to delete whole array chunk
        delete data[i].title; //delete field
    }
}

答案 2 :(得分:1)

首先,你应该坚持你需要删除的项目的索引,打破循环,然后删除。我用过分裂。不要直接在循环中删除。

其次,你在纸浆小说中有一个拼写错误,如果那是你试图删除的那个。

此代码有效

  <button value="Pulp Fiction">Button</button>

  var data = [{
      title: "40 männlich Jungfrau sucht",
      director: "Judd Apatow",
      year: 2005,
      playTime: 116,
      fsk: 14
  }, {
      title: "Pulp Fiction",
      director: "Quentin Tarantino",
      year: 1994,
      playTime: 148,
      fsk: 16
  }, {
      title: "Inglourious Basterds",
      director: "Quentin Tarantino",
      year: 2009,
      playTime: 148,
      fsk: 16
  }];

  $('button').click(function () {
      var indexToDelete = 4;
      for (var e in data) {

          if (data[e].title.toString() == $(this).attr('value')) {
              indexToDelete = e;
              break;
          }
      }
      data.splice(indexToDelete,1);
      console.log(data);
  });