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 精确统计网站访问量的实例代码
Jul 05 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
Apr 15 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
微信小程序 五星评价功能的实现
Mar 09 Javascript
微信小程序 开发之全局配置
May 05 Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
Jan 09 jQuery
javascript绘制简单钟表效果
Apr 07 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
Sep 17 Javascript
uniapp开发打包多端应用完整方法指南
Dec 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
jquery 简单导航实现代码
2009/09/11 Javascript
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
Python修改MP3文件的方法
2015/06/15 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
财务工作个人求职的自我评价
2013/12/19 职场文书
实习生评语
2014/04/26 职场文书
阳光体育活动总结
2014/04/30 职场文书
课外活动实习计划
2015/01/19 职场文书
边城读书笔记
2015/06/29 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
python异常中else的实例用法
2021/06/15 Python
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript