作者TonyQ (沉默是金。)
看板Ajax
标题[心得] jQuery.unique 讨论
时间Wed Sep 8 23:34:59 2010
基本上我目前觉得应该是个蛮无用的 jQuery 内部函式(笑
不过 jQuery tw google group 有人问所以翻了一下,
顺手一起把回应内容也贴过来罗。
-----------------------------------------------------
先看看官方的 example
http://api.jquery.com/jQuery.unique/
官方的 exmaple 说明的蛮清楚的,重新解释如下
------------这是官方 example 的 html 部份
<div>There are 6 divs in this document.</div>
<div></div>
<div class="dup"></div>
<div class="dup"></div>
<div class="dup"></div>
<div></div>
------------
首先分析一下,整个sample 共6个div ,
其中 ".dup" selector 可以拿到三个。
------------
------------这是官方 code
var divs = $("div").get(); // unique() must take a native array
// TonyQ: 这里 get 是把 jQuerycontext
// 转成「真正的」 array 而已,本质上就是dom array。
// add 3 elements of class dup too (they are divs)
divs = divs.concat($(".dup").get());
// 用阵列加法,把 ".dup"拿到的三个「真正的 dom array」加到这阵列,
// 总共阵列中物件是九个,但是就真正的dom物件而言,
// 这里只有六个是不重复的。
$("div:eq(1)").text("Pre-unique there are " + divs.length + "elements.");
//印出来验证一下 数量 的确是九个
divs = jQuery.unique(divs);
//去重复元素。
$("div:eq(2)")
.text("Post-unique there are " + divs.length + "elements.")
.css("color", "red");
//印出来确认一下,应该只留下六个 dom 。
-----------------------底下有几点要注意的
根据官方说明:
This function only works on plain JavaScript arrays of DOM elements,
and is chiefly used internally by jQuery.
也就是说这个只能比对 dom 物件,拿他来比其他东西是不会work的;
另外它会重新照在 document 中出现的顺序中排序,虽然这 feature 不一定用得到。 :p
(As of jQuery 1.4 the results will always be returned in document order.)
至於他的实做是直接采用 Sizzle engine 的 uniqueSort ,这实作内容也非常简单。 :)
Sizzle.uniqueSort = function(results){
if ( sortOrder ) {
// sortOrder 有作 browser fix ,是一个排序用的函式(comparator)
// 後面还有说明
hasDuplicate = baseHasDuplicate;
//这里有作一些browser fix,baseHasDuplicate 看成 false就好。
// sortOrder 的意义就是去找出他在 document 中的 index 来做比较,
//并会以此判断它有没有 duplicate,
//如果有找到,在这个sort的过程中会把 hasDuplicate 设成 true 。
// 所以如果有一个dom 是被clone过的,又刚好都出现在这阵列中,
// 在这里「不会」被当成 duplicate 滤掉。
// 例子看这 http://jsfiddle.net/tG9jN/
// 也因为这样,所以它只能 support dom array 的运算,c
// 不能用来做一般阵列的运算。
// 相关实做可以看 1.4.2 uncompressed 原码 3364 行以後的部份 ,
// 有提到用 sourceIndex 等浏览器资料来运算的实做。
results.sort(sortOrder);
if ( hasDuplicate ) {
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[i-1] ) {
results.splice(i--, 1);
}
}
}
}
return results;
};
--
我:一半的日子让你说,我听你说你的所有
______________________________________
______________________________________一半的日子我想说,对你说过去的所有:我
_______________________________________________________
在讨论中妥善扮演兼具聆听与分享的角色,是我们一生的课题。
_______________________________________________________
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.137.2.106
1F:推 megaman1206:如果unique可以用在一般阵列就好了 09/08 23:43
2F:→ TonyQ:只要做 comparator ,基本上完全可以自己实做吧 XD 09/08 23:45
3F:→ TonyQ:这篇给的逻辑也是 sort 然後照着跑loop而已啊 :3 09/08 23:46
4F:→ TonyQ:差异只有 comparator,不过 unique 有这麽常用吗 @_@ 09/08 23:46