2013-10-30 99 views
1

您能幫我嗎?我正在做的是刪除重複的html表格行。以下是我的代碼。在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'刪除了表格行,但該行仍在循環中。希望你明白我的意思。所以最終的結果是空表。你能幫我解決這個問題嗎?

+0

什麼'$我在的jsfiddle溶液在5 IST左(「TR:具有(輸入[值= 「+ value +」])「)。remove()'? – jantimon

+0

@jantimon不足 - 他仍然必須迭代每個「」並考慮所有_following_「」元素。 – Alnitak

+1

@Alnitak你是對的,但他可以使用http://api.jquery.com/nextAll/ – jantimon

回答

2

你有兩個顯著的​​問題:

  1. 當尋找於行「N」你只需要比較從行開始其他行的「N + 1」,而不是從一開始就

  2. 刪除來自DOM的元素不會將它們從您當前正在迭代的jQuery對象中移除它們...

下面的代碼似乎工作。它依次查看每一行,然後標記任何後續行 - .nextAll('tr') - 如果其第二個單元格具有相同的內容,則將其與類remove進行標記。然後它會完成所有DOM刪除。在http://jsfiddle.net/alnitak/ZzsTt/

0

,你可以使用while循環

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

工作演示代替, 你必須先保存您的元素數組中,並遍歷它自己。 當然你需要另一個布爾表達式來比較它們是否符合你的標準。

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++; 
    } 
} 
在該示例

只有數組

嵌合上述 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++; 
    } 
}