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 按位与运算符 (&amp;)使用介绍
Feb 04 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
Oct 23 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
详解jquery easyui之datagrid使用参考
Dec 05 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
Node.js 使用AngularJS的方法示例
May 11 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
Aug 10 Javascript
react 移动端实现列表左滑删除的示例代码
Jul 04 Javascript
JS中封装axios来管控api的2种方式
Sep 11 Javascript
vue实现购物车功能(商品分类)
Apr 20 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模板引擎SMARTY
2006/10/09 PHP
php下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
php数据访问之查询关键字
2016/05/09 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
php封装一个异常的处理类
2017/06/08 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
javascript类型转换示例
2014/04/29 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
Python Requests安装与简单运用
2016/04/07 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
生日庆典策划方案
2014/06/02 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
商铺门面租房协议书
2014/10/21 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
Node与Python 双向通信的实现代码
2021/07/16 Javascript
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android