1

请你帮助我好吗?我正在做的是删除重复的 html 表格行。以下是我的代码。

    $("table#" + Grid + " > tbody  > tr").each(function () {

         ParentID = $(this).find("td:eq(0) input:checkbox").val();
         ParentManufacturer = $(this).find("td:eq(2)").html();

         $("table#" + Grid + " > tbody  > tr").each(function () {

              ChildID = $(this).find("td:eq(0) input:checkbox").val();
              ChildManufacturer = $(this).find("td:eq(2)").html();                 

              if (ParentID != ChildID && ParentManufacturer == ChildManufacturer) {
                   $(this).remove();
              }
         });
    });

问题是删除的表行仍在循环中。例如。即使我删除了制造商名称为“AAA”的表行,该行仍在循环中。希望你明白我的意思。因此,最终结果是空表。你能帮我解决这个问题吗?

4

2 回答 2

2

你有两个重要的问题:

  1. 查看“n”行时,您只需要比较从“n + 1”行开始的其他行,而不是从头开始

  2. 从 DOM 中删除元素不会将它们从您当前正在迭代的 jQuery 对象中删除...

下面的代码似乎工作。它依次查看每一行,然后如果第二个单元格具有相同的内容.nextAll('tr'),则使用该类标记任何后续行。remove然后它会在之后执行所有 DOM 删除。

// get all rows
var $tr = $("table#" + Grid + " > tbody  > tr");

// then for each row
$tr.each(function() {

    if ($(this).hasClass('remove')) return;  // we already did this value
    var val = $(this.cells[1]).text();       // get current row's value

    // tag matching following rows
    $(this).nextAll('tr').not('.remove').filter(function() {
        return $(this.cells[1]).text() === val;
    }).addClass('remove');       

});

// now remove the tagged rows
$tr.filter('.remove').remove();

在http://jsfiddle.net/alnitak/ZzsTt/工作演示

于 2013-10-30T16:36:09.770 回答
0

您可以改用while循环,您必须先将元素保存在数组中并自己对其进行迭代。当然,您需要另一个布尔表达式来比较它们是否符合您的条件。

var a=[1,2,3,4,5,4,3,2,1];
var i=0;
while(a.length > 0 && i<a.length){
  console.log("check elem:" + a[i]);
  var j=i+1;
  var double = false;
  while(j < a.length ){
    if(a[i]==a[j]){
      a.splice(j,1);
      double=true;
    } else {
      j++;
    }
  }
  if(double){
    a.splice(i,1);
  } else {
    i++;
  }
}

在这个例子中,数组中只剩下 5 个

在上面的 jsfiddle 中安装了我的解决方案 http://jsfiddle.net/ZzsTt/19/

var Grid = "table";
// get all rows
var rows = $("table#" + Grid + " > tbody  > tr");
rows = $.makeArray(rows);

var i=0;
while(rows.length > 0 && i<rows.length){
 var j=i+1;
  var double = false;
  var val = $(rows[i].cells[1]).text();
  while(j < rows.length ){
    if( $(rows[j].cells[1]).text() == val ){
      $(rows[j]).addClass("remove");
      //$(rows[j]).remove();
      rows.splice(j,1);
      //uncomment statement below to have all elements which occur more than once
      //otherwise first stays

      //double=true;
    } else {
      j++;
    }
  }
  if(double){
   $(rows[j]).addClass("remove");  
   //$(rows[i]).remove();  
   rows.splice(i,1);   
  } else {
    i++;
  }
}
于 2013-10-30T17:41:18.090 回答