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 相关文章推荐
phpwind放自动注册方法
Dec 02 Javascript
ext for eclipse插件安装方法
Apr 27 Javascript
基于JQuery的一句话搞定手风琴菜单
Sep 14 Javascript
js中将String转换为number以便比较
Jul 08 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
Dec 08 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
Feb 28 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
Jun 14 Javascript
谈谈JavaScript的New关键字
Aug 26 Javascript
Vue.js原理分析之observer模块详解
Feb 17 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
VUE写一个简单的表格实例
Aug 06 Javascript
关于vue表单提交防双/多击的例子
Oct 31 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
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
详解Python中DOM方法的动态性
2015/04/11 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
Python加速程序运行的方法
2020/07/29 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
个人简历自我评价八例
2013/10/31 职场文书
公司请假条格式
2014/04/11 职场文书
婚前协议书怎么写
2014/04/15 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
如何使用php生成zip压缩包
2021/04/21 PHP
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
React中的Context应用场景分析
2021/06/11 Javascript
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android