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 用cloneNode方法克隆节点的代码
Oct 15 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
Jquery实现纵向横向菜单
Jan 24 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
Vue.js路由vue-router使用方法详解
Mar 20 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
详解关于微信setData回调函数中的坑
Feb 18 Javascript
基于JavaScript实现大文件上传后端代码实例
Aug 18 Javascript
Javascript如何实现扩充基本类型
Aug 26 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
curl和libcurl的区别简介
2015/07/01 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
php之可变变量的实例详解
2017/09/12 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
Javascript浅谈之引用类型
2013/12/18 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
Python列表解析配合if else的方法
2018/06/23 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
python单例模式的多种实现方法
2019/07/26 Python
python实现简单颜色识别程序
2020/02/19 Python
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
优秀毕业生求职信范文
2014/01/02 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
如何利用python实现Simhash算法
2022/06/28 Python