Prototype Array对象 学习


Posted in Javascript onJuly 19, 2009
Array.from = $A; (function() { 
//Array原型的引用     
var arrayProto = Array.prototype, 
slice = arrayProto.slice, 
     //JS 1.6里面会有原生的forEach方法 
_each = arrayProto.forEach; // use native browser JS 1.6 implementation if available 
function each(iterator) { 
for (var i = 0, length = this.length; i < length; i++) 
iterator(this[i]); 
} 
//如果不是JS1.6,_each设置成对象的each方法 
//这里的_each方法是覆盖了Enuerable里面的_each方法 
if (!_each) _each = each; 
function clear() { 
this.length = 0; 
return this; 
} 
function first() { 
return this[0]; 
} 
function last() { 
return this[this.length - 1]; 
} 
//返回所有Array内不为null的数据 
function compact() { 
return this.select(function(value) { 
return value != null; 
}); 
} 
//把多维数组压成一维数组 
function flatten() { 
return this.inject([], function(array, value) { 
if (Object.isArray(value)) 
return array.concat(value.flatten()); //这里有递归调用 
array.push(value); 
return array; 
}); 
} 
function without() { 
var values = slice.call(arguments, 0); 
return this.select(function(value) { 
return !values.include(value); 
}); 
} 
function reverse(inline) { 
return (inline !== false ? this : this.toArray())._reverse(); 
} 
//返回所有Array内不重复的元素,如果数组是有序的,传入true参数,执行起来会更快 
function uniq(sorted) { 
return this.inject([], function(array, value, index) { 
if (0 == index || (sorted ? array.last() != value : !array.include(value))) 
array.push(value); 
return array; 
}); 
} 
//取两个数组的交集 
function intersect(array) { 
return this.uniq().findAll(function(item) { 
return array.detect(function(value) { return item === value }); 
}); 
} 

function clone() { 
return slice.call(this, 0); 
} 
function size() { 
return this.length; 
} 
function inspect() { 
return '[' + this.map(Object.inspect).join(', ') + ']'; 
} 
function toJSON() { 
var results = []; 
this.each(function(object) { 
var value = Object.toJSON(object); 
if (!Object.isUndefined(value)) results.push(value); 
}); 
return '[' + results.join(', ') + ']'; 
} 
function indexOf(item, i) { 
i || (i = 0); 
var length = this.length; 
if (i < 0) i = length + i; 
for (; i < length; i++) 
if (this[i] === item) return i; 
return -1; 
} 
function lastIndexOf(item, i) { 
i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; 
var n = this.slice(0, i).reverse().indexOf(item); 
return (n < 0) ? n : i - n - 1; 
} 
function concat() { 
var array = slice.call(this, 0), item; 
for (var i = 0, length = arguments.length; i < length; i++) { 
item = arguments[i]; 
     //这的第二条件是防止把调用方法的数组元素也一起concat起来 
if (Object.isArray(item) && !('callee' in item)) { 
for (var j = 0, arrayLength = item.length; j < arrayLength; j++) 
array.push(item[j]); 
} else { 
array.push(item); 
} 
} 
return array; 
} 
//mixin Enumerable里面的方法 
Object.extend(arrayProto, Enumerable); 
if (!arrayProto._reverse) 
arrayProto._reverse = arrayProto.reverse; 
Object.extend(arrayProto, { 
_each: _each, 
clear: clear, 
first: first, 
last: last, 
compact: compact, 
flatten: flatten, 
without: without, 
reverse: reverse, 
uniq: uniq, 
intersect: intersect, 
clone: clone, 
toArray: clone, 
size: size, 
inspect: inspect, 
toJSON: toJSON 
}); 
//这个bug网上没搜到,谁知道说一下? 
var CONCAT_ARGUMENTS_BUGGY = (function() { 
return [].concat(arguments)[0][0] !== 1; 
})(1,2) 
if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; 
//检查JS是否原生支持indexOf和lastIndexOf方法,不支持则设置成对象内的方法 
if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; 
if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; 
})();

clear
clone
compact
each
first
flatten
from
indexOf
inspect
last
reduce
reverse
size
toArray
toJSON
uniq
without
下面给出一些方法的例子,简单的方法就不给出例子了。
flatten():
['frank', ['bob', 'lisa'], ['jill', ['tom', 'sally']]].flatten() 
// -> ['frank', 'bob', 'lisa', 'jill', 'tom', 'sally']

reduce():这个方法的意思就是,如果数字里面有一个数据,这直接返回这个数据,否则返回原来的数组
uniq():

['Sam', 'Justin', 'Andrew', 'Dan', 'Sam'].uniq(); 
// -> ['Sam', 'Justin', 'Andrew', 'Dan'] ['Prototype', 'prototype'].uniq(); 
// -> ['Prototype', 'prototype'] because String comparison is case-sensitive

without():

[3, 5, 6, 1, 20].without(3) 
// -> [5, 6, 1, 20] [3, 5, 6, 1, 20].without(20, 6) 
// -> [3, 5, 1]
Javascript 相关文章推荐
Javascript 陷阱 window全局对象
Nov 26 Javascript
ExtJS 2.0实用简明教程 之获得ExtJS
Apr 29 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
jquery插件开发注意事项小结
Jun 04 Javascript
简单谈谈Javascript中类型的判断
Oct 19 Javascript
JavaScript操作 url 中 search 部分方法函数
Jun 15 Javascript
javascript 利用arguments实现可变长参数
Nov 21 Javascript
简单实现Vue的observer和watcher
Dec 21 Javascript
js实现将json数组显示前台table中
Jan 10 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
Feb 02 Javascript
vue双向绑定数据限制长度的方法
Nov 04 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
Feb 04 jQuery
Prototype PeriodicalExecuter对象 学习
Jul 19 #Javascript
Prototype String对象 学习
Jul 19 #Javascript
Prototype Template对象 学习
Jul 19 #Javascript
Prototype Number对象 学习
Jul 19 #Javascript
Prototype ObjectRange对象学习
Jul 19 #Javascript
Prototype RegExp对象 学习
Jul 19 #Javascript
Prototype Class对象学习
Jul 19 #Javascript
You might like
PHP中Session的概念
2006/10/09 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
分享php邮件管理器源码
2016/01/06 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
Python使用django获取用户IP地址的方法
2015/05/11 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
css3的transition属性详解
2014/12/15 HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
财务会计专业求职信范文
2013/12/31 职场文书
一份婚庆公司创业计划书
2014/01/11 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书