在Jquery中过滤HTML表行

时间:2013-10-30 16:32:12

标签: jquery

你能帮帮我吗?我正在做的是删除重复的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();
              }
         });
    });

问题是删除的表行仍然在进行循环。例如。即使我已经用manucafturer名称'AAA'删除了表格行,这一行仍然在循环中。希望你明白我的意思。所以,最终的结果是空表。你能帮我修一下这个问题吗?

2 个答案:

答案 0 :(得分:2)

您有两个重要问题:

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

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

  3. 以下代码似乎有效。它依次查看每一行,然后如果第二个单元格具有相同的内容,则使用类.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/

    的工作演示

答案 1 :(得分: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++;
  }
}