//对数组的扩展实现Array.implement({

//迭代方法,call的使用    forEach: function(fn, bind)    {for (var i =0, l =this.length; i < l; i++)    fn.call(bind, this[i], i, this);    }});

//将each作为forEach的别名Array.alias('forEach', 'each');

//转为数组的快捷方式,但是在IE下,对于XML对象使用XPath查询后的结果,$A方法无法达到预期的结果function $A(iterable)    {if (iterable.item)    { //对于collection,使用for遍历复制到数组var array = [];for (var i =0, l = iterable.length; i < l; i++)    array[i] = iterable[i];return array;    }

//对于arguments和array对象,使用本方法可以转为数组return Array.prototype.slice.call(iterable);};

//通用迭代遍历方法function $each(iterable, fn, bind)    {var type = $type(iterable);    ((type =='arguments'|| type =='collection'|| type =='array') ? Array : Hash).each(iterable, fn, bind);};

/*对Array的扩展实现对于迭代遍历时,给fn传递的参数依次为:当前数组项,当前项的索引值,当前数组对象,比如:7前逢单7后双,判断月份大小的算法function myfilter(item, i, arr){var half = arr.length / 2 + 1;return half > i && item % 2 || half <= i && !(item % 2);}[1,2,3,4,5,6,7,8,9,10,11,12].filter(myfilter);上面的代码将返回[1, 3, 5, 7, 8, 10, 12]然而,很多时候我们只需要使用第一个参数,即当前项的值*/Array.implement({

//对数组的每一项使用一个逻辑判断,仅当所有项通过逻辑判断时返回true    every: function(fn, bind)    {for (var i =0, l =this.length; i < l; i++)    {if (!fn.call(bind, this[i], i, this))    returnfalse;        }returntrue;    },

//对数组进行逻辑过滤,返回包含所有通过逻辑判断的项的数组    filter: function(fn, bind)    {var results = [];for (var i =0, l =this.length; i < l; i++)    {if (fn.call(bind, this[i], i, this))    results.push(this[i]);        }return results;    },

//配合$defined和filter方法,清除数组中的空项/    clean: function()    {returnthis.filter($defined);    },

/*    类似String对象的indexOf方法,返回数组在指定位置开始查找指定的匹配项,并返回其索引值,没有找到时返回-1    from参数可以在0和数组长度-1之间取值,也可以为负值,当为负值时表示开始查找的位置从后往前的位数*/    indexOf: function(item, from)    {var len =this.length;for (var i = (from <0) ? Math.max(0, len + from) : from ||0; i < len; i++)    {if (this[i] === item)    return i; //注意这里用的是绝对等于===比较        }return-1;    },

//对数组中的每项进行处理,fn函数的返回值将代表原位置的项,最后返回一个经处理后的新数组    map: function(fn, bind)    {var results = [];for (var i =0, l =this.length; i < l; i++)    results[i] = fn.call(bind, this[i], i, this);return results;    },

//与every方法相反,只需要数组中的有一项满足条件就返回true    some: function(fn, bind)    {for (var i =0, l =this.length; i < l; i++)    {if (fn.call(bind, this[i], i, this))    returntrue;        }returnfalse;    },

//将两个数组关联,组成键-值表示的对象,注意数组充当键还是值的决定因素--当前数组的每项作为值    associate: function(keys    ){var ōbj = {}, length = Math.min(this.length, keys.length);for (var i =0; i < length; i++)    obj[keys[i]] =this[i];return obj;    },

//将数组的每项使用参数对象的方法进行处理,当返回true时当前项被添加到键值对象中作为值,处理的方法名作为键    link: function(object)    {var result = {};for (var i =0, l =this.length; i < l; i++)    {for (var key in object)    {if (object[key](this[i]))    {                    result[key] =this[i]; //键和值的关系delete object[key]; //保证result中键不重复,数组中索引值越小优先级越高break;                }            }        }return result;    },

//利用index方法判断数组中是否包含指定项    contains: function(item, from)    {returnthis.indexOf(item, from) !=-1;    },

//扩展数组,将指定数组加到当前数组后面    extend: function(array){for (var i =0, j = array.length; i < j; i++)    this.push(array[i]);returnthis;    },

//获取数组的最后一项,只是一个快捷方式    getLast: function()    {return (this.length) ?this[this.length -1] : null;    },

//随机获取数组的一项    getRandom: function()    {return (this.length) ?this[$random(0, this.length -1)] : null;    },

//将指定项包含到数组,仅当数组中不存在该项时才会添加,通常用于不允许重复项的数组处理    include: function(item)    {if (!this.contains(item))    this.push(item);returnthis;    },

//合并数组,并且保证数组的项不重复    combine: function(array)    {for (var i =0, l = array.length; i < l; i++)    this.include(array[i]);returnthis;    },

//在数组中删除指定项    erase: function(item)    {for (var i =this.length; i--; i)    {if (this[i] === item)    this.splice(i, 1); //注意用的是===        }returnthis;    },

//清空数组    empty: function()    {this.length =0;returnthis;    },

/*    将数组降维,即当数组中的项为数组时,将期拆开,按顺序加到新数组中    这个在不能确定某个变量是数组还是单项时特别有用,比如说,我可以传[1,2,3],也可以传[1,[2,3]]*/    flatten: function()    {var array = [];for (var i =0, l =this.length; i < l; i++)    {var type = $type(this[i]);if (!type) continue;            array = array.concat((type =='array'|| type =='collection'|| type =='arguments') ? Array.flatten(this[i]) : this[i]);        }return array;    },

//颜色转换,从十六进制转为RGB表示    hexToRgb: function(array)    {if (this.length !=3)    returnnull;var rgb =this.map(function(value)    {if (value.length ==1) value += value;return value.toInt(16);        });return (array) ? rgb : 'rgb('+ rgb +')';    },

//颜色转换,从RGB转为十六进制表示    rgbToHex: function(array)    {if (this.length <3)    returnnull;if (this.length ==4&&this[3] ==0&&!array) return'transparent';var hex = [];for (var i =0; i <3; i++)    {var bit = (this[i] -0).toString(16);                hex.push((bit.length ==1) ?'0'+ bit : bit);        }return (array) ? hex : '#'+ hex.join('');    }});

[转帖]Mootools源码分析-04 -- Array相关推荐

  1. [转帖]Mootools源码分析-49 -- Asset

    原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-410355 原作者:我佛山人 代码 //脚本,样式和图片的 ...

  2. [转帖]Mootools源码分析-02 -- Utils

    原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-400118 原作者:我佛山人 //检查对象是否已经定义或者 ...

  3. [转帖]Mootools源码分析-03 -- Hash

    //哈希表,Native化作为内置对象var Hash =new Native({ //族名,类名,用于$type方法的精准类型判断 name: 'Hash', initialize: functio ...

  4. 【Busybox】Busybox源码分析-04 | ash和login程序

    文章目录 一.ash程序入口分析 二.ash_main总结 三.login进程 四.login程序入口分析 五.login_main总结 busybox版本:1.35.0 一.ash程序入口分析 as ...

  5. MooTools 1.4 源码分析 - (关于Core、Type等模块分析)

        MooTools由1.3升级到1.4的过程中,这几个核心模块只有String模块和Event模块(现在已修改为DOMEvent)做了比较大的修改,这几个模块源码的分析参考 棍子上的萝卜 所写的 ...

  6. 【Android SDM660源码分析】- 04 - UEFI ABL LinuxLoader 代码分析

    [Android SDM660源码分析]- 04 - UEFI ABL LinuxLoader 代码分析 1. LinuxLoader.c 系列文章: <[Android SDM660开机流程] ...

  7. v55.04 鸿蒙内核源码分析(重定位) | 与国际接轨的对外发言人 | 百篇博客分析HarmonyOS源码

    子张问善人之道.子曰:"不践迹,亦不入于室." <论语>:先进篇 百篇博客系列篇.本篇为: v55.xx 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外发言人 加载 ...

  8. v09.04 鸿蒙内核源码分析(调度故事) | 用故事说内核调度 | 百篇博客分析HarmonyOS源码

    子曰:"吾与回言终日,不违如愚.退而省其私,亦足以发.回也,不愚."<论语>:为政篇 百篇博客系列篇.本篇为: v09.xx 鸿蒙内核源码分析(调度故事篇) | 用故事 ...

  9. v54.04 鸿蒙内核源码分析(静态链接) | 一个小项目看中间过程 | 百篇博客分析HarmonyOS源码

    子曰:"回也其庶乎,屡空.赐不受命,而货殖焉,亿则屡中." <论语>:先进篇 百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 一个小项目看中 ...

最新文章

  1. php的cookie不存在会是什么值,PHP之你不得不知道的COOKIE含义及使用方式
  2. java中有几种内部类,Java中的四种内部类
  3. linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程
  4. java 四舍五入_《JAVA编程思想》5分钟速成:1-4章:概述
  5. 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之64---BREW 应用的交叉编译...
  6. ubuntu下mingw32交叉编译环境搭建
  7. 计组实验-CPU设计-指令添加
  8. 百词斩 计算机英语词汇表,单词之美四级-英语词汇百词斩拓海有道金山词霸典...
  9. 查看MySQL初始密码并修改
  10. failed creating java jvm.dll
  11. 手机端,跟pc 链接qq 客服
  12. 素数的线性筛 欧拉函数
  13. sql查询重复订单号
  14. 【NOIP 费用流】JZOJ_3029 观光公交
  15. OpenFOAM动态加密网格的负载平衡
  16. 我要有女朋友肯定带她吃完这上面所有的小吃(很便宜哥们儿们行动起来吧)
  17. iHerb中国这个app怎么样?iHerb中国邮政EMS与顺丰速运区别点在哪里?
  18. 用c语言实现三子棋,它来了!!
  19. 记javascript设计模式
  20. svn使用(服务器端和客户端)

热门文章

  1. lisp的vla函数画矩形_难点解析丨反比例函数的图象和性质
  2. thymeleaf依赖_玩转SpringBoot集成 Thymeleaf 模版引擎
  3. c语言87,C语言程序设计87300.doc
  4. java basic认证_Basic认证
  5. Win7 IIS7.5运行ASP时出现500错误的解决办法
  6. 在Linux里安装和启动nginx的方法
  7. Windows编程---------MessageBox
  8. 点击返回到另一个界面
  9. 函数递归简单题-hdoj-2044 2018-一只小蜜蜂 母牛的故事
  10. 2.12.ECMAScript--运算符