`
zhangyaochun
  • 浏览: 2613206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

jQuery源码浅谈系列---工具方法$.merge与$.unique

阅读更多

很多人在使用jquery的时候应该多会有array去重或者合并的需求吧,那么你一定对$.merge和$.unique不会陌生吧。

 

1.$.merge----------其实这个功能只是合并两个数组,返回的是array,包含第一个数组的元素后面跟着第二个数组元素

 

ps:这个不会去重复

 

上源码:/*

原理其实还是比较简单
i是第一个数组的length
l是第二个数组的length
对第二个进行循环,在第一个数组length的基础上++往里面赋值
所以返回的数组是第一个数组然后是第2个数组
*/

function merge(first,second){
   var i = first.length,
         j = 0;
   if(typeof second.length === "number"){
        for(var l =second.length;j<l;j++){
            first[i++] = second[j];
     } 
  }else{
          while(second[j] !== undefined){
                   first[i++] = second[j++];
          }
 }
 first.length = i;   //严谨的jquery啊,一般人是不会想到这边控制一下的
 return first;
}

$.merge([0,1,2],[2,1,3]) ------------------------[0,1,2,2,1,3]

 

2.$.unique --------如果你是一个jquery接触比较长的或者一直研究的人你会发现,这个api是经历过版本变革

 

1.3rc2版本中源码是这个的

/*
注意这个版本是没有对数组元素为字符串和数字去重功能的
如果要改的话可以吧 jQuery.data(array[i])直接换成array[i]
*/
function unique(array){
    var ret =[],done ={};
    try{
         for(var i=0,length =array.length;i<length;i++){
                  var id= jQuery.data(array[i]);
                  if(!done[id]){
                        done[id] = true;
                        ret.push(array[i]);
                 }
            }
     }catch(e){
             ret =array;
     }
     return ret;
}
 

 

变革点在1.4.1,从这个版本开始你会发现这样一句话

 

jQuery.unique = Sizzle.uniqueSort;

 没有单独的unique的api了,你不知道Sizzle,好吧,多看看源码吧。不过我也会陆续放出自己的一些文档说明

好了先上源码:

/*
当然这边我没有放出sortOrder相关的api,有兴趣的自己看看
我注意想说的是思想
其实大家注意了splice了吧
算法是从index第一个开始和第0个去比,依次下去,相同就调用splice删除一个
*/
function uniqueSort(results){
       if(sortOrder){
           hasDuplicate = baseHasDuplicate;
           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;
}
 

 

其实如果你一直在研究jQuery的源码 你会发现除了很多人一直再喊的性能上的提高,无论是代码的严谨性和兼容饱满性多在每一个版本中体现。学习JQuery,你需要的慢慢是从使用它,到2次封装它,再到领会它。

 

ps:下面我放出一个自己lib库的array的unique方法(设计思想还是tangram的,你不知道tangram,噢,你out了,呵呵)

/*
*unique-unique the array;if it has same items will delete one*
*@param {Array} source---the array*
*@param {Function} compareFn---the compareFn*
*@return {Array} result ----the uniqued array*
*/
ZYC.array.unique = function(source,compareFn){
      var _length =source.length,
	      result =source.slice(0), //clone source
		  i,_item;
	  // if compareFn is not function we will build one 	  
      if('functrion' != typeof compareFn){
	     compareFn = function(item1,item2){
		    return item1 === item2;
		 };
	  }
	  //we use double circulation to compare the items 
	  while (--_length >0){
         _item = result[_length];     // start from the last 
         i = _length;
         while(i --){
            if(compareFn(_item,result[i])){
			   result.splice(_length,1);
			   break;
			}
		 }		 
	  }
	  return result;
};

 十一的目前是进一步熟悉tangram grid。。自己也要写一个啊.

各位十一快乐

3
1
分享到:
评论
2 楼 zhangyaochun 2011-09-30  
lizaochengwen 写道
请问:tangram有什么好呢???跟jquery有什么区别和优势???

每一个人看法不一样 对自己有提高就行。。我虽然一直研究jQuery到现在,但是我还是觉得jQuery的核心包依赖大,不可分离,而且比较jQuery的研究需要有点资本的人才理解。。而tangram是分离式的,简单,性能上也不差
1 楼 lizaochengwen 2011-09-30  
请问:tangram有什么好呢???跟jquery有什么区别和优势???

相关推荐

    jquery-migrate-1.2.1.min.js

    `jQuery Migrate` 是一个非常重要的工具,尤其对于那些依赖旧版 jQuery 功能或插件的开发者来说。在本文中,我们将深入探讨 `jQuery Migrate 1.2.1.min.js` 的作用、如何解决 `jQuery` 和 `jqPrint` 兼容性问题,...

    jQuery-in-Action.part2.pdf

    本章深入探讨了jQuery提供的各种工具函数,包括浏览器检测标志、数组操作函数、对象扩展与合并以及动态加载脚本等。通过这些函数,开发者可以更高效地编写代码,同时增强代码的可维护性和可扩展性。接下来的章节将...

    jQuery 1.5 API 中文版

    $.jQuery( selector [, context] ), .jQuery( element ), .jQuery( elementArray ), .jQuery( jQueryObject ), .jQuery( ) $.jQuery( html [, ownerDocument] ), .jQuery( html, props ) $.jQuery( fn ) jQuery ...

    Jquery-Cheat-Sheet-1.2

    - **`.each()`, `.extend()`, `.grep()`, `.map()`, `.merge()`, `.trim()`, `.unique()`**:提供了一系列实用的数组和字符串操作方法。 - **`.ajaxComplete()`, `.ajaxError()`, `.ajaxSend()`, `.ajaxStart()`, `....

    jQuery编程笔记

    - **官方网站**: [www.jquery.com](http://www.jquery.com) - **下载**: 可以直接从官网下载最新的稳定版或开发版。 - **CDN**: 使用CDN链接引入jQuery库,如Google CDN等。 3. **学习资源** - **官方文档**: ...

    TortoiseGit-2.8.0.0-64bit.msi+TortoiseGit-LanguagePack-2.8.0.0-64bit-zh_CN.msi

    TortoiseGit是一款深受开发者喜爱的Git版本控制系统与Windows资源管理器集成的工具。这个压缩包包含两个重要的组件,即"TortoiseGit-2.8.0.0-64bit.msi"和"TortoiseGit-LanguagePack-2.8.0.0-64bit-zh_CN.msi"。 ...

    jquery 1.12.4版本.zip

    9. **$.extend()和$.merge()**:这两个方法用于合并对象或数组,是jQuery中常用的实用工具。 10. **$.each()**:这是一个遍历对象或数组的迭代器,可以用来执行自定义操作。 在升级到jQuery 1.12.4时,可能遇到的...

    npm-merge-driver:git merge驱动程序,用于解决与npm相关的文件中的冲突

    npm-merge-driver(1)-用于自动合并锁文件的git merge驱动程序自动设置(推荐): 要立即开始使用它: $ npx npm-merge-driver install --global或按项目在本地安装: $ cd /path/to/git/repository$ npx npm-merge...

    TortoiseSVN-1.10.0.28176-x64-svn-1.10.0.msi

    《TortoiseSVN-1.10.0.28176-x64-svn-1.10.0.msi:深入理解版本控制系统与TortoiseSVN》 在信息技术领域,版本控制是不可或缺的一部分,它帮助开发者管理项目代码的变更历史,协同工作并确保数据的安全性。...

    jQuery最新源码库

    6. **实用工具方法** - **尺寸与位置**: `width()`, `height()`, `offset()`等方法获取元素的尺寸和位置信息。 - **内容操作**: `html()`, `text()`, `val()`用于获取或设置元素的内容、文本或值。 - **数组与...

    jquery1.11.0手册

    jQuery 1.11.0 速查表 核心 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 each(callback) size() length selector ...

    yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼merge-data-qffrm.zip

    yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼merge_data-qffrm.zip;yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼merge_data-qffrm.zip;yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼...

    64位-TortoiseSVN-1.8.8.25755-x64-svn-1.8.10.msi.rar

    《TortoiseSVN在64位Windows环境下的应用与详解》 TortoiseSVN,作为一款广受欢迎的Subversion(SVN)客户端,以其直观的图形用户界面和强大的版本控制功能,深受开发者和团队协作人员的喜爱。本文将详细探讨64位版...

    TortoiseSVN-1.9.5.27581-x64-svn-1.9.5.msi安装包

    《TortoiseSVN-1.9.5.27581-x64-svn-1.9.5.msi安装包》是一款基于Subversion(简称SVN)的图形化客户端工具,专为Windows平台设计。Subversion是一种广泛使用的版本控制系统,其核心功能在于跟踪文件和目录的变更,...

    7-PDF.Split.and.Merge.Portable 2

    《7-PDF.Split.and.Merge.Portable 2:轻松掌握PDF合并与分割技术》 PDF(Portable Document Format)格式因其跨平台、保持原文档格式不变的特性,在日常工作和学习中广泛应用。然而,面对大量的PDF文件,有时我们...

    jQuery.spin.js自定义页面加载Loading动画代码

    jQuery是一个广泛使用的JavaScript库,它的易用性和丰富的功能使其成为网页开发的首选工具。而jQuery.spin.js是基于jQuery的一个扩展,它引入了Spinner库,这是一个轻量级的解决方案,用于创建各种各样的Loading动画...

    two-phase-merge_sort-.rar_2phase merge sort_merge_sort_two merge

    标题中的"two-phase-merge_sort-.rar_2phase merge sort_merge_sort_two merge"指的是一个采用两阶段归并排序算法的程序或文档集合。这个算法是针对大数据量、无法一次性加载到内存中的情况设计的,常见于外部排序...

    jQuery1.4 API

    $.inArray(value, array) $.toArray() $.merge(first, second) $.unique(array) $.parseJSON(json) 函数操作 $.noop $.proxy(function, scope) 测试操作 $.contains(container, contained) $.isArray(obj) $.is...

Global site tag (gtag.js) - Google Analytics