如果我的HTML看起来像:
<div><h1>red</h1></div>
<div><h1>red</h1></div>
<div><h1>red</h1></div>
<div><h1>red</h1></div>
<div><h1>yellow</h1></div>
<div><h1>yellow</h1></div>
<div><h1>yellow</h1></div>
<div><h1>green</h1></div>
<div><h1>pink</h1></div>
jQuery中评估有多少h1匹配的最佳方法是什么,如果匹配计数是&gt; 1对于特定的h1,将其div放在容器div中:
<div class="matches">
<div><h1>red</h1></div>
<div><h1>red</h1></div>
<div><h1>red</h1></div>
<div><h1>red</h1></div>
</div>
<div class="matches">
<div><h1>yellow</h1></div>
<div><h1>yellow</h1></div>
<div><h1>yellow</h1></div>
</div>
<div><h1>green</h1></div>
<div><h1>pink</h1></div>
我已经挂了一个each()函数,它将每个h1返回给我,但我不确定这是否是最好的方法(jQuery newb试图突破新领域)。
答案 0 :(得分:3)
var $containers = $('div'),
$headings = $containers.find('> h1'),
targetContainer = 'body',
matches = {};
/*
* First we traverse through the headings
* pushing exact matches to a 'matches' object
*/
$headings.each(function() {
var $this = $(this),
text = $this.text();
if (typeof matches[text] === 'undefined') {
matches[text] = [];
}
matches[text].push($this.closest('div')[0]);
});
/*
* Remove the initial, unsorted collection
*/
$containers.remove();
/*
* Now let's see if we have duplicate
* headings.
*/
for (group in matches) {
if (matches[group].length > 1) {
/*
* Put them all in a '.matches' div
* and append to our target container
* e.g. body
*/
$('<div class="matches"></div>').html(matches[group]).appendTo(targetContainer);
/*
* Delete the group
* after use
*/
delete matches[group];
}
}
/*
* This is optional:
* I used two separate loops to
* put unmatched headings after the
* matched groups.
*
* You could use the if..else from
* the previous loop.
*/
for (group in matches) {
$(matches[group]).appendTo(targetContainer);
}
此代码即使使用混合的无序集合也可以使用,例如
<div><h1>red</h1></div>
<div><h1>green</h1></div>
<div><h1>yellow</h1></div>
<div><h1>red</h1></div>
<div><h1>red</h1></div>
<div><h1>yellow</h1></div>
<div><h1>red</h1></div>
<div><h1>yellow</h1></div>
<div><h1>pink</h1></div>
<强>更新强>
正如我所提到的,可以将匹配和不匹配的组保持在一起 - 删除第二个for..in
循环并使用if..else
,如下所示:
/* ...
* Now let's see if we have duplicate
* headings.
*/
for (group in matches) {
if (matches[group].length > 1) {
/*
* Put them all in a '.matches' div
* and append to our target container
* e.g. body
*/
$('<div class="matches"></div>').html(matches[group]).appendTo(targetContainer);
} else {
$(matches[group]).appendTo(targetContainer);
}
}
但是,由于JavaScript对象存储在内存中的方式,无法预测枚举的顺序。
答案 1 :(得分:0)
$('div').eq(0).before('<div class="matches">');
var this_element= '';
var next_element = '';
var length = 0 ;
$('div').each(function(){
this_element= $(this).find('h1').text();
next_element = $(this).next('div').find('h1').text();
if((this_element!= next_element) && (next_element!='') && (length>0)){
$(this).after('</div><div class="matches">');
length = 0 ;
}
if((!next_element) && (length>0)){
$(this).after('</div>');
length = 0 ;
}
length++;
});