jquery从列表1中删除不在列表2中的项目

时间:2012-12-28 16:23:29

标签: jquery

我有一个看似非常简单的问题,但我的带宽现在已经非常有限了,并且搜索了SO但发现a relevant question仅适用于C#,我的意思是没有运气。

HTML:

<ul class="first">
  <li data-id="1">One</li>
  <li data-id="2">Two</li>
  <li data-id="3">Thre</li>
  <li data-id="4">Four</li>
  <li data-id="5">Five</li>
  <li data-id="6">Six</li>
</ul>
<ul class="second">
  <li data-id="1">One</li>
  <li data-id="2">Two</li>
  <li data-id="3">Thre</li>
  <li data-id="4">Four</li>
</ul>

我想删除第一项中的最后两项(因此是五项和六项),因为它们在第二项中不存在。订单实际上并不重要。样本简化了我的问题。 基本上没有明确的想法来实现这一点,对不起,所以每当我尝试使用.length检查时,我都会删除所有第一项。

非常感谢任何提示。感谢

更新: 对不起这是我的错。 “订单实际上并不重要”:我的意思是列表可能是无序的,如:

<ul class="second">
  <li data-id="3">Thre</li>
  <li data-id="1">One</li>      
  <li data-id="4">Four</li>
  <li data-id="2">Two</li>
</ul>

也适用于第一个。

4 个答案:

答案 0 :(得分:9)

如果您按data-id属性评估等效性:

$('.first li').filter(
    function(){
        return !$('.second li[data-id="' + $(this).data('id') + '"]').length;
    }).remove();​

JS Fiddle demo

参考文献:

答案 1 :(得分:2)

$('ul.first li:gt(3)').remove();

或者:

var $first = $('.first li'), $second = $('.second li');

$first.filter(function(){
    return !$second.filter('[data-id='+ this.dataset.id +']').length
}).remove();  

答案 2 :(得分:1)

试试这个

var set1 = $('.first').children(),
    set2 = $('.second').children();

set1.filter(function() {
    var testingId = $(this).data('id'),
        found = set2.filter(function() {
            return $(this).data('id') === testingId;
        });

    return found.length === 0;
}).remove();

演示 http://jsfiddle.net/gaby/Ehewz/

答案 3 :(得分:1)

// start by building a list of elements in list two.
var list2 = {};
$('.second li').each(function(){
    // by data id.
    list2[$(this).attr('data-id')] = true;
    // by text
    // list2[$(this).text()] = true;
});
// Then remove any values from the first list where it's data-id isn't in our list.
$('.first li').each(function(){
    // Make replacement here to match text.
    if( ! list2[ $(this).attr('data-id') ] ){
    // if( ! list2[ $(this).text() ] ){
        $(this).remove();
    }
});