如何根据值过滤行?

How to filter rows based on value?

这是我之前的问题。

How to filter records by clicking div array?

我有一个 table,它的 ID 作为最后一列,在单击 ID 时,我需要过滤第二行 table(只是为了保留与 [=20= 的 ID 匹配的记录) ]1) 并过滤其他。

<!DOCTYPE html>
<html>
<body>

<table border=1 style="width:100%">
<th>Col1</th><th>Col2</th><th>Ids</th>
  <tr>
    <td>Jill</td>
    <td>Book</td>       
    <td>50,23,34</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Cook</td>       
    <td>94,23,45,23</td>
  </tr>
  <tr>
    <td>John</td>
    <td>Teacher</td>        
    <td>80,12,34,45</td>
  </tr>
  <tr>
    <td>Ram</td>
    <td>Miner</td>      
    <td>50,56,67,45</td>
  </tr>
  <tr>
    <td>Raj</td>
    <td>Engineer</td>       
    <td>94,23,12,34,56,23</td>
  </tr>
  <tr>
    <td>Gav</td>
    <td>Principal</td>      
    <td>80,67,89,45,23,12</td>
  </tr>
</table>


<br><br>

<B>Index Table</B>
<br>

<table id="dataTable" border =1 cellspacing="1" cellpadding="1" style="width:100%">
<tr><th>Ids</th><th>Class</th><th>Marks</th></tr>
  <tr>
    <td>12</td>
    <td>Class1</td> 
    <td>250</td>
  </tr>
  <tr>
    <td>23</td>
    <td>Class2</td> 
    <td>294</td>
  </tr>
 <tr>
    <td>24</td>
    <td>Class3</td> 
    <td>250</td>
  </tr>
  <tr>
    <td>34</td>
    <td>Class1</td> 
    <td>294</td>
  </tr>
 <tr>
    <td>50</td>
    <td>Class1</td> 
    <td>250</td>
  </tr>
  <tr>
    <td>45</td>
    <td>Class3</td> 
    <td>294</td>
  </tr>
 <tr>
    <td>23</td>
    <td>Class1</td> 
    <td>250</td>
  </tr>
  <tr>
    <td>67</td>
    <td>Class2</td> 
    <td>294</td>
  </tr>
 <tr>
    <td>89</td>
    <td>Class2</td> 
    <td>250</td>
  </tr>
<tr>
    <td>80</td>
    <td>Class1</td> 
    <td>250</td>
  </tr>
  <tr>
    <td>94</td>
    <td>Class1</td> 
    <td>294</td>
  </tr>
 <tr>
    <td>56</td>
    <td>Class1</td> 
    <td>250</td>
  </tr>
</table>
</body>
</html>

在上一个问题中,每次我都需要为每一行分配函数ID并为每一行定义函数,但是我的tables可能有数百万行所以不可能手动完成。如何实现自动化?

据我了解,当用户单击第一个 table 的 ID 列中的 a 时,它会过滤第二个 table ,仅显示存储在单击的 div 中的 ID。

把id放在第一个table :

<table id="first-table" border="1" style="width:100%">

并在第一个 table 中编辑包含 ID 的 TD:

<td id="td-containing-ids">id1,id2,id3</td>

(我建议在这里使用 css 而不是过时的 html 语法和内联样式)

这应该有效:

// checks if 'value' is in 'array' 
function isInArray(value, array) {
  return array.indexOf(value) > -1;
}

// will select rows based on the text attribute og this
// in 'this' will be stored the <td> you just clicked
function selectRows() {

    // get the ids in a string
    var ids = $(this).text().split(',');
    var display; // a little trick to avoid more code

    // iterate through every row of the second table
    // this is not a very optimal way to do it, but you get it ;)
    $('#dataTable tr td:first-child').each(function(){

        // in 'this' is stored the first <td> of the second table(of each row, of course)
        if( isInArray( $(this).text(), ids ) ) {
            // this means the id is found in the 'ids' array
            display = 'block'; //or whatever suits you here
        }
        else {
            // this means the id of the row is not in the 'ids' array
            display = 'none'
        }
        $(this).parent().css('display', display);
    });

}
// use event delegation when you have a bunch of elements
$('#first-table').on('click', '#td-containing-ids', selectRows);

如果您在第二个 table 中存储了很多 ID 和很多行,这不是很高效。我希望你能理解 :)。

所以我在这里做什么: - 将事件处理程序附加到第一个 table 中的每个 (我是通过事件委托来做到这一点的,如果您有很多元素并且想将事件附加到每个人,这是一个很好的做法,see this 了解更多信息。)

  • 获取点击的文本
  • 我们刚刚得到的文本实际上是我们想要在第二个显示的 id table
  • 我们将它们放在一个数组中
  • 我们逐行遍历第二个table
  • 我们从带有 id 的文本(从第二行开始)
  • 如果这个 id 在我们的第一个数组中,则该行可见 (通过显示:block/table-row)
  • 如果这个 id 不在我们的第一个数组中,则该行不可见 (通过显示:none)

我的代码中的错误: - 我们每次点击都会遍历第一个 table,它的每一行,所以在每次用户交互时,jQuery 必须遍历 DOM...如果你有很多行第二个table,这不好。如果在第二个 table 中的页面加载后不添加其他行,则可以在运行时从第二个 table 中获取行并将它们存储在数组中(仅引用 DOM 对象及其 ID)