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操作文本框readOnly
May 15 Javascript
JS OffsetParent属性深入解析
Jan 13 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
jQuery 获取多选框的值及多选框中文的函数
May 16 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
Apr 26 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
two.js之实现动画效果示例
Nov 06 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 Javascript
vxe-table vue table 表格组件功能
May 26 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
Oct 23 Javascript
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使用eAccelerator的API开发详解
2013/06/09 PHP
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
php自定义apk安装包实例
2014/10/20 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
Python OS模块常用函数说明
2015/05/23 Python
python中关于for循环的碎碎念
2017/06/30 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
python中的数据结构比较
2019/05/13 Python
Python socket聊天脚本代码实例
2020/01/02 Python
Python接口测试文件上传实例解析
2020/05/22 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
公司营业员的自我评价
2014/03/04 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
优秀毕业生求职信
2014/06/05 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书