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 相关文章推荐
来自qq的javascript面试题
Jul 24 Javascript
统计jQuery中各字符串出现次数的工具
May 03 Javascript
浅析JavaScript中的常用算法与函数
Nov 21 Javascript
js实现俄罗斯方块小游戏分享
Jan 31 Javascript
jQuery中andSelf()方法用法实例
Jan 08 Javascript
详谈JS中实现种子随机数及作用
Jul 19 Javascript
JavaScript从0开始构思表情插件
Jul 26 Javascript
AngularJS实现单独作用域内的数据操作
Sep 05 Javascript
AngularJS中使用three.js的实例详解
Jul 21 Javascript
利用three.js画一个3D立体的正方体示例代码
Nov 19 Javascript
layui实现数据表格点击搜索功能
Mar 26 Javascript
javaScript实现一个队列的方法
Jul 14 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中让curl支持sock5的代码实例
2015/01/21 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
详解vuex的简单使用
2018/03/12 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
用Python解决计数原理问题的方法
2016/08/04 Python
python 链接和操作 memcache方法
2017/03/04 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
详解flask入门模板引擎
2018/07/18 Python
python实现顺序表的简单代码
2018/09/28 Python
python读取文本中的坐标方法
2018/10/14 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
python爬虫容易学吗
2020/06/02 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
门卫岗位安全职责
2013/12/13 职场文书
部门活动策划方案
2014/08/16 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA