jQuery.unique()的实现方式
jQuery.unique()的实现方式
jQuery 中的 unique()
jQuery中 的 unique() 函数实现了对 DOM ELement按出现位置进行排序并去除重复元素的功能。使用方法如下:
<html><head></head><body onload="test()"><div id="div_1"><div id="div_2" /></div><div id="div_3" /><script type='text/javascript' src='jquery.js'></script><script type='text/javascript'>function test() {var divs = [document.getElementById('div_3'),document.getElementById('div_1'),document.getElementById('div_2'),document.getElementById('div_2'),document.getElementById('div_1')];var html = show('before uinque', divs);$.unique(divs);html += show('after uinque', divs);document.write(html);}function show(name, divs) {var html = '';for (var i = 0; i < divs.length; ++i) {html += divs[i].getAttribute('id') + '<br />';}return name + ':<br />' + html + '<br />';}</script></body></html>
before uinque:div_3div_1div_2div_2div_1after uinque:div_1div_2div_3
$ = function() {return {unique: function(elems) {for (var i = 0; i < elems.length; ++i) {for (var j = i + 1; j < elems.length; ++j) {if (elems[i] === elems[j]) {elems.splice(i--, 1);break;}}}return elems;},unique2: function(elemsWithId) {var obj = {};for (var i = 0; i < elemsWithId.length; ++i) {var elem = elemsWithId[i];obj[elem.getAttribute('id')] = elem;}elemsWithId.length = 0;for (var id in obj) {elemsWithId.push(obj[id])}return elemsWithId;}}}();
unique3: function(sortedElems) {for ( var i = 1; i < sortedElems.length; i++ ) {if ( sortedElems[i] === sortedElems[ i - 1 ] ) {sortedElems.splice( i--, 1 );}}return sortedElems;}
$ = function() {var sort = function(a, b){var aParents = getParents(a), bParents = getParents(b), al = aParents.length, bl = bParents.length, i, ap, bp;for (i = 0; i < al && i < bl; i++) {ap = aParents[i];bp = bParents[i];if (ap !== bp) {return siblingCheck(ap, bp);}}return i === al ?siblingCheck(a, bp, -1) :siblingCheck(ap, b, 1);}; var getParents = function(elem) { var ret = [], cur; for (cur = elem; cur; cur = cur.parentNode) { ret.unshift(cur); } return ret; }var siblingCheck = function(a, b, ret) {if (a === b) { return ret; }var cur = a;while (cur && (cur = cur.nextSibling)) {if (cur === b) {return -1;}}return 1;};return {unique : function(elems) {elems.sort(sort);for ( var i = 1; i < elems.length; i++ ) {if ( elems[i] === elems[ i - 1 ] ) {elems.splice( i--, 1 );}}return elems;}}}();
$ = function() { var hasDuplicate = true; [0, 0].sort(function() { hasDuplicate = false; return 0; });var sort = function(a, b){ if (a === b) { hasDuplicate = true; return 0; }// Other Codes ...}; var getParents = function(elem) { // Other Codes ... }var siblingCheck = function(a, b, ret) {// Other Codes ...};return {unique : function(elems) {elems.sort(sort); if (hasDuplicate) { for ( var i = 1; i < elems.length; i++ ) { if ( elems[i] === elems[ i - 1 ] ) { elems.splice( i--, 1 ); } } }return elems;}}}();
if (document.documentElement.compareDocumentPosition) { var sort = function(a, b) { if (a === b) { hasDuplicate = true; return 0; } if (!a.compareDocumentPosition || !b.compareDocumentPosition) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; } } else { var sort = function(a, b) { // Original implemention ... } }
var sort = function(a, b){ var aParents = getParents(a), bParents = getParents(b), al = aParents.length, bl = bParents.length, ap = a.parentNode, bp = b.parentNode, i; if (a === b) { hasDuplicate = true; return 0; // If the nodes are siblings (or identical) we can do a quick check } else if (ap === bp) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if (!ap) { return -1; } else if (!bp) { return 1; } for (i = 0; i < al && i < bl; i++) { ap = aParents[i]; bp = bParents[i]; if (ap !== bp) { return siblingCheck(ap, bp); } } return i === al ? siblingCheck(a, bp, -1) : siblingCheck(ap, b, 1); };