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 相关文章推荐
js实现权限树的更新权限时的全选全消功能
Feb 17 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
Feb 10 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
Apr 23 Javascript
JavaScript 32位整型无符号操作示例
Dec 08 Javascript
javascript正则表达式之search()用法实例
Jan 19 Javascript
JS实现标签页切换效果
May 04 Javascript
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
Jun 16 Javascript
Angular如何引入第三方库的方法详解
Jul 13 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
Sep 18 Javascript
使用Vue-Router 2实现路由功能实例详解
Nov 14 Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 Javascript
javascript实现前端分页效果
Jun 24 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
PHP中的session安全吗?
2016/01/22 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
PHP反射基础知识回顾
2020/09/10 PHP
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
SVG描边动画
2017/02/23 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
Vue渲染函数详解
2017/09/15 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python多线程原理与用法详解
2018/08/20 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
"引用"与多态的关系
2013/02/01 面试题
求职简历中个人的自我评价
2013/12/01 职场文书
门卫岗位安全职责
2013/12/13 职场文书
公司寄语大全
2014/04/10 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
爱国主义影片观后感
2015/06/18 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
如何用python反转图片,视频
2021/04/24 Python
pytorch实现ResNet结构的实例代码
2021/05/17 Python
python多次执行绘制条形图
2022/04/20 Python