【问题标题】:Remove duplicate cells of a column删除列的重复单元格
【发布时间】:2012-11-22 19:19:37
【问题描述】:

我想删除列的重复单元格。

<table id="test" border="1">
    <tr>
    <td>test1<td>
    <td>test2<td>
    <td>test3<td>
    </tr>
      <tr>
    <td>test4<td>
    <td>test2<td>
    <td>test5<td>
    </tr>
    <tr>
    <td>test6<td>
    <td>test2<td>
    <td>test5<td>
    </tr>
          <tr>
    <td>test6<td>
    <td>test8<td>
    <td>test9<td>
    </tr>
    </table>​​​

output
------
test1        test2        test3    
test4        test2        test5    
test6        test2        test9    
test6        test8        test9    


I want in this format
---------------------
test1        test2        test3    
test4                     test5     
test6                     test9    
             test8           

【问题讨论】:

  • 到目前为止您尝试了哪些方法,具体遇到了什么问题?你的问题到底是什么?
  • 您最好不要删除这些单元格,只需清空它们即可。从表格中删除单元格会变得一团糟。真的很快。
  • 为什么人们在不理解问题的情况下投反对票????如果就这么简单,我可以自己做
  • @Tuscan:可能是因为您没有显示任何尝试自己解决问题。老实说,你甚至没有问任何问题,你只是说出了你想要的。我想要一只独角兽。
  • 我认为这个问题很有趣,但问题可以改进。我建议您编辑您的问题,正确解释您的问题并提供一个更好(也许更简洁)的示例。

标签: javascript jquery


【解决方案1】:

这只会删除跨列的重复文本。它之所以有效,是因为元素是按文档顺序选择的:

var seen = {};
$('#test td').each(function() {
    // Encode column and content information.
    var key =  $(this).index() +  $(this).text();
    if (seen[key]) {
        $(this).text('');
    }
    else {
        seen[key] = true;
    }
})​;

如果您的单元格跨越多列,它可能不起作用。

略微调整DEMO

更新:仅适用于连续单元格。这个想法是跟踪在一个列中看到的先前值。

var seen = {};
$('#test td').each(function() {
    var index =  $(this).index();
    var txt = $(this).text();
    if (seen[index] === txt) {
        $(this).text('');
    }
    else {
        seen[index] = txt;
    }
})​;

DEMO(注意右栏中的test5

【讨论】:

  • Thanx 但如果一列的 2 个单元格之间不匹配,则不应清除该列的下一个单元格。例如,如果我将 test1 放在第 3 行的第 1 列,则不应将其清除,因为第 2 行的第 1 列不匹配。非常抱歉没有正确解释问题
  • 所以您只想清除 连续 个单元格...是的,如果您提供一个清楚地显示您想要实现的目标的示例,那真的很有帮助。
【解决方案2】:

您可以使用此模式here

jsFiddle here.

var seen = {};
$('#removeDupes').on('click', function(){
    $('#test tr td').each(function() {
        var txt = $(this).text();
        var index = $(this).parent('tr').children('td').index(this);
        if (!seen[index]){
            seen[index] = new Array();
        }

        if (seen[index][txt]) {
            $(this).html('&nbsp;');
        }
        else {
            seen[index][txt] = true;
        }
    });
});​

请注意,您的 &lt;/td&gt; 元素未正确关闭,并且根据 ahren 的评论,删除 td entirely 可能会导致对齐问题。

【讨论】:

  • 这将删除表格中任何位置的重复元素,而不仅仅是跨行。
【解决方案3】:

你可以试试这样的,

Live Demo

arr = [];
$('#test td').each(function(){
    key = "" + $(this).index() + $.trim($(this).text());
       if(arr.indexOf( key ) == -1)
           arr.push(key );
       else
           $(this).text('')    
});​

【讨论】:

  • 如果我把 test1 放在最后一行的最后一列,那么它不应该被删除
  • 现在删除跨行的重复项,而不是列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2015-10-15
  • 1970-01-01
  • 2016-01-19
  • 2014-11-11
  • 1970-01-01
相关资源
最近更新 更多