我有一个看似非常简单的问题,但我的带宽现在已经非常有限了,并且搜索了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>
也适用于第一个。
答案 0 :(得分:9)
如果您按data-id
属性评估等效性:
$('.first li').filter(
function(){
return !$('.second li[data-id="' + $(this).data('id') + '"]').length;
}).remove();
参考文献:
答案 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();
答案 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();
}
});