【问题标题】:jQuery: Finding duplicate ID's and removing all but the firstjQuery:查找重复的 ID 并删除除第一个之外的所有 ID
【发布时间】:2013-03-23 11:56:46
【问题描述】:
    $('[id]').each(function () {

        var ids = $('[id="' + this.id + '"]');

        // remove duplicate IDs
        if (ids.length > 1 && ids[0] == this) $('#' + this.id).remove();

    });

上面将删除第一个重复的 ID,但我想删除最后一个。我试过$('#'+ this.id + ':last'),但无济于事。

Fiddle

在小提琴中,当附加操作发生时,应保留值为“sample”的输入。

【问题讨论】:

    标签: javascript jquery each


    【解决方案1】:

    尝试使用以下功能对我来说效果很好:

     $('#favourities-ajax ul li').each(function(i) {
          $('[id="' + this.id + '"]').slice(1).remove();
          });
    

    【讨论】:

      【解决方案2】:

      使用 jquery 过滤器:gt(0) 排除第一个元素。

      $('[id]').each(function () {
          $('[id="' + this.id + '"]:gt(0)').remove();
      });
      

      或者选择所有可用元素,然后使用.slice(1)排除第一个元素。

      $('[id]').each(function (i) {
          $('[id="' + this.id + '"]').slice(1).remove();
      });
      

      【讨论】:

      • $(this).attr('id') === this.id
      • 而不是使用:gt(0) 重复选择器,您可以使用ids.slice(1) 来获取除ids 中的第0 个元素之外的所有内容
      • 我想删除最后一个元素。我该怎么办??
      • 我试过 $('.product').slice(0).remove();它正在删除所有产品
      【解决方案3】:
      $('[id]').each(function() {
         var $ids = $('[id=' + this.id + ']');
         if ($ids.length > 1) {
           if(this.id === your_id)//which is duplicating
               $ids.not(':first').remove();
           }
      });
      

      【讨论】:

      • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
      • 它将删除重复的 id 留下第一个,这有助于删除重复的 id ......
      • 它将删除除第一个之外的所有重复 id
      【解决方案4】:

      你可以试试

      $("#ID").nextAll().remove();
      

      【讨论】:

      • 他可以试试,但是不行。它将删除 #id 的所有后续兄弟姐妹,无论它们具有什么元素或 ID。
      【解决方案5】:

      试试这个

      var duplicated = {};
      
      $('[id]').each(function () {   
      
          var ids = $('[id="' + this.id + '"]');
      
          if ( ids.length <= 1 ) return  ;
      
          if ( !duplicated[ this.id ] ){
               duplicated[ this.id ] = [];   
          }       
      
          duplicated[ this.id ].push( this );
      
      });
      
      // remove duplicate last ID, for elems > 1 
      for ( var i in duplicated){
      
          if ( duplicated.hasOwnProperty(i) ){  
      
                   $( duplicated[i].pop() ).remove();            
          }
      }
      

      而 jsfiddle 是 http://jsfiddle.net/z4VYw/5/

      【讨论】:

      • pop 只会返回一个元素。
      【解决方案6】:

      这段代码比其他一些代码长,但双嵌套循环应该使其操作显而易见。

      这种方法的优点是它只需要扫描 DOM 以生成具有id 属性的元素列表一次,然后使用相同的列表来查找(和删除)重复。

      已删除的元素将具有parentNode === null,因此可以在遍历数组时跳过。

      var $elems = $('[id]');
      var n = $elems.length;
      
      for (var i = 0; i < n; ++i) {
          var el = $elems[i];
          if (el.parentNode) {  // ignore elements that aren't in the DOM any more
              var id = el.id;
              for (var j = i + 1; j < n; ++j) {
                  var cmp = $elems[j];
                  if (cmp.parentNode && (cmp.id === id)) {
                      $(cmp).remove();  // use jQuery to ensure data/events are unbound
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案7】:

        试试:

         $('[id="' + this.id + '"]:not(#" + this.id + ":first)').remove();
        

        【讨论】:

          【解决方案8】:

          我会使用not()ids 中删除当前元素并删除其余元素:

          (Fiddle)

          $('body').on("click", ".placeholder", function() {
          
              data = '<section id="e1"><input name="e1name" /></section><section id="two"><input name="two" value="two section" /></section>';
          
              $('form').append(data);
          
                  // ideally I'd like to run this function after append but after googling I find that's not possible.
                  // for each ID ...
                  $('[id]').each(function () {
          
                      var ids = $('[id="' + this.id + '"]');
          
                      if (ids.length>1) {                    
                          ids.not(this).remove();            
                      }
          
                      return;
          
                  });
          
          });
          

          【讨论】:

            猜你喜欢
            • 2021-01-28
            • 2023-01-20
            • 1970-01-01
            • 1970-01-01
            • 2010-09-27
            • 1970-01-01
            • 2018-08-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多