今天重点讲下 如何给Array对象扩展
1、直接在Array.prototype 上扩展
2、用自己方法对数组对象进行扩展
直接在Array.prototype上扩展,不能直接对dom对象使用(如:document.getElementsByTagName('div')得到的nodeList);
对有洁癖的同学而言 也破了原始生态环境的 : )
先来看下 yui操作数组的一些方法,这里我对源码简单剥离并改动了下
复制代码 代码如下:
(function(){
var YArray;
YArray = function(o,idx,arraylike){
var t = (arraylike) ? 2 : YArray.test(o),
l, a, start = idx || 0;
if (t) {
try {
return Array.prototype.slice.call(o, start); //借助Array原生方法来把aguments转换为JS数组
} catch(e) {
a = [];
l = o.length;
for (; start<l; start++) {
a.push(o[start]);
}
return a;
}
} else {
return [o];
}
}
YArray.test = function(o){
var r = 0;
if (o && (typeof o == 'object' ||typeof o == 'function')) {
if (Object.prototype.toString.call(o) === "[object Array]") {
r = 1;
} else {
try {
if (('length' in o) && !o.tagName && !o.alert && !o.apply) {
r = 2;
}
} catch(e) {}
}
}
return r;
}
YArray.each = (Array.prototype.forEach) ? //先检测浏览器是否已支持,若有则调用原生
function (a, f, o) {
Array.prototype.forEach.call(a || [], f, o || Y);
return YArray;
} :
function (a, f, o) {
var l = (a && a.length) || 0, i;
for (i = 0; i < l; i=i+1) {
f.call(o || Y, a[i], i, a);
}
return YArray;
};
YArray.hash = function(k, v) {
var o = {}, l = k.length, vl = v && v.length, i;
for (i=0; i<l; i=i+1) {
if (k[i]) {
o[k[i]] = (vl && vl > i) ? v[i] : true;
}
}
return o;
};
YArray.indexOf = (Array.prototype.indexOf) ?
function(a, val) {
return Array.prototype.indexOf.call(a, val);
} :
function(a, val) {
for (var i=0; i<a.length; i=i+1) {
if (a[i] === val) {
return i;
}
}
return -1; //寻找不到的情况
};
YArray.numericSort = function(a, b) {
return (a - b); //从小到大排序, return (b - a); 从大到小
};
YArray.some = (Array.prototype.some) ?
function (a, f, o) {
return Array.prototype.some.call(a, f, o);
} :
function (a, f, o) {
var l = a.length, i;
for (i=0; i<l; i=i+1) {
if (f.call(o, a[i], i, a)) {
return true;
}
}
return false;
};
})();
借助Array原生方法来把aguments转换为JS数组的其他方法 (Dom对象不可以,只有遍历)
复制代码 代码如下:
Array.apply(null,arguments);
[].slice.call(arguments,0);
[].splice.call(arguments,0,arguments.length);
[].concat.apply([],arguments);
...
YArray函数不仅可以操作数组对象也对nodeList对象进行了操作
YArray(document.getElementsByTagName("div"));
遍历dom对象 重新组装成一个数组 : )
复制代码 代码如下:
a = [];
l = o.length;
for (; start<l; start++) {
a.push(o[start]);
}
return a;
YArray.each
遍历数组,如有传入函数,每次遍历都执行callback
复制代码 代码如下:
YArray.each([1,2,3],function(item){
alert(item);// 执行了3次,1,2,3
});
YArray.hash
数组 组装成 键值对 可以理解成一个json对象
YArray.hash(["a","b"],[1,2]);
YArray.indexOf
返回(想要找寻值)一样的该值在数组的索引值
YArray.indexOf([1,2],1)
YArray.numericSort
对数组进行排序,从小到大
[3, 1, 2].sort(YArray.numericSort);
YArray.some
是否数组中的有元素通过了callBack的处理?如果有,则立马返回true,如果一个都没有,则返回false
复制代码 代码如下:
YArray.some([3, 1, 2],function(el){
return el < 4;
})
让我们看看 javascript 1.6 -1.8 对数组的扩展 ,并学习如何实现相同的功能
every
filter
forEach
indexOf
lastIndexOf
map
some
reduce
reduceRight
Array.prototype.every
复制代码 代码如下:
if (!Array.prototype.every)
{
Array.prototype.every = function(fun /*, thisp*/)
{
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this &&
!fun.call(thisp, this[i], i, this))
return false;
}
return true;
};
}
是否数组中的每个元素都通过了callBack的处理?如果是,则返回true,如果有一个不是,则立马返回false
这和我们刚才提到的YUI种的 some 函数 很雷同 :) 功能刚好相反
Array.prototype.filter
复制代码 代码如下:
Array.prototype.filter = function (block /*, thisp */) { //过滤器 ,添加方便,进行判断过滤
var values = [];
var thisp = arguments[1];
for (var i = 0; i < this.length; i++)
if (block.call(thisp, this[i]))
values.push(this[i]);
return values;
};
使用方法
复制代码 代码如下:
var val= numbers.filter(function(t){
return t < 5 ;
})
alert(val);
forEach 和 indexOf 和 some 可以参考 上面yui的代码 ,不再重述
lastIndexOf 和 indexOf 代码相似 只是从最后开始遍历
下面讲下 ‘ map'
复制代码 代码如下:
Array.prototype.map = function(fun /*, thisp*/) {
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = new Array(len);
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in this)
res[i] = fun.call(thisp, this[i], i, this);
}
return res;
};
遍历数组,执行函数,迭代数组,每个元素作为参数执行callBack方法,由callBack方法对每个元素进行处理,最后返回处理后的一个数组
var numbers = [1, 4, 9];
var roots = numbers.map(function(a){return a * 2});
Array.prototype.reduce
复制代码 代码如下:
Array.prototype.reduce = function(fun /*, initial*/) {
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
if (len == 0 && arguments.length == 1)
throw new TypeError();
var i = 0;
if (arguments.length >= 2) {
var rv = arguments[1];
} else {
do {
if (i in this) {
rv = this[i++];
break;
}
if (++i >= len)
throw new TypeError();
} while (true);
}
for (; i < len; i++) {
if (i in this)
rv = fun.call(null, rv, this[i], i, this);
}
return rv;
};
让数组元素依次调用给定函数,最后返回一个值,换言之给定函数一定要用返回值
Array.prototype.reduceRight
见名故而思意,从右往左
复制代码 代码如下:
Array.prototype.reduceRight = function(fun /*, initial*/) {
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
if (len == 0 && arguments.length == 1)
throw new TypeError();
var i = len - 1;
if (arguments.length >= 2) {
var rv = arguments[1];
} else {
do {
if (i in this) {
rv = this[i--];
break;
}
if (--i < 0)
throw new TypeError();
} while (true);
}
for (; i >= 0; i--) {
if (i in this)
rv = fun.call(null, rv, this[i], i, this);
}
return rv;
};
除了这些,只用想用到的方法都能加到Array.prototype上
比如常用的toString
复制代码 代码如下:
Array.prototype.toString = function () {
return this.join('');
};
还可以添加 toJson ,uniq ,compact,reverse等
Array扩展对开发还是很有帮助滴 : )
相关推荐:
在线AI文章生成:内容创作新革命
AI一键生成文章在线:提升创作效率,改变写作方式
ChatGPT网络故障报告从协调世界时(UTC)晚上1107左右开始激增,15分钟内引发广泛关注,ai无视进化
SEO关键词利器:如何借助精准关键词提升网站流量与排名,ai绘画客户
为什么seo吸引人,为什么seo吸引人呢 ,ai路径查找器绘制树
SEO站外优化策略:提升网站排名的关键因素,遵义公司网站推广
ChatGPT目前,我无法查看或打开附件,但我依然能为你提供全面的帮助,苹果ai谷歌ai
SEO查:如何用精准的SEO诊断助力网站流量爆发,美团关键词排名怎么补
ChatGPT页面不自动显示最新消息:如何解决这一困扰,提升使用体验?,斑马ai幼儿百度云网盘
为什么新手做seo好做,为什么要懂seo ,ai少女 3060显卡
AI人工智能文章生成器写作新纪元
SEO公司核心业务是什么?揭秘提升网站排名的奥秘,写作助手ai一键生成作文在线
SEO快速优化技术:助力网站流量暴增,轻松登顶搜索引擎,铜陵ai全网通推广软件
文章AI指令提升写作效率的智能助手
ChatGPT在处理文本时可能无法完全理解上下文的复杂性,肌肉ai
AI人工智能:开发与应用的必备软件推荐
seo相当于什么职业,seo相当于什么职业类别 ,usatisfy ai
亚马逊seo是什么公司的,“亚马逊” ,ai玩底特律
SEO要不,来看看如何通过SEO优化提高网站流量和曝光度,seo 获客技巧
SEO刷:让你的网站一夜之间登顶搜索引擎!,独特seo技巧
ChatGPT免费用户每天的使用限制:如何高效利用,突破困境!,花花制作ai
SEO数量-如何提升你的网站排名与流量?,射阳seo优化五星服务
好用的AI写作软件,让创作更高效
seo给你什么帮助,seo的利与弊 ,ai 大厨
seo需要学些什么内容,学seo的基础 ,中国ai公司年收入
ChatGPT出现报错503?这些解决办法你必须知道!,粉墨ai说唱
SEO针对中小企业的增长潜力:如何通过精准优化抢占市场先机,网络推广和营销就选y火10星评价
代哥SEO-让您的网站迅速登顶搜索引擎的秘密武器,济南关键词的排名优化
SEO爱站:提升网站排名,赢得流量的秘密武器,优化网站设计价格多少
ChatGPT服务异常:为何影响到你的工作和生活?如何有效解决?,ai怎么保持圆角不变
SEO兼职:如何通过SEO兼职实现收入增长与职业突破,濮阳网站建设官网
OpenAIGPTChatSoraOpenAIChatGPT服务在中断数小时后已恢复,ai视图线稿
SEO任何:如何通过精准优化让网站流量突破极限,太原网站建设培训班
ChatGPT怎么打不开了?揭秘背后的原因与解决方法,ai中打开ai文件丢失
AI免费写文章生成器高效写作新革命
优化型网站:提升企业竞争力的必备利器,重庆网站推广工作如何
SEO优化快:如何在短时间内实现网站流量爆发,Lacey0508ai
为什么关键词太少会影响你的网络营销效果?,陕西seo网站推广工具
SEO实现:如何通过SEO优化提升网站流量与排名,南京市公司网站推广
ChatGPT破解版电脑:如何获得更强大的AI助手,提升工作与学习效率,ai预设动画
ChatGPT恢复正常使用时间,提升你的工作与生活效率,联想电脑AI0510
WPJam:打破网站管理的壁垒,打造极致用户体验,广东谷歌seo工具
SEO很多,如何在竞争激烈的市场中脱颖而出?,在SEO优化中
SEO代做:让你的企业轻松登顶搜索引擎,快速提升曝光率,seo 提高注册量
AI助手不需要登陆-畅享便捷生活,随时随地高效工作,ai客服 对话
ChatGPT付款被拒?如何应对与解决常见支付问题,掉包ai
ChatGPT诞生背景:人工智能如何突破语言的边界,ai辅助市场调研
线上AI写作免费一键生成,轻松提升写作效率,解放创作思维
seo需要什么人才,seo需要做什么工作 ,探索ai照片
SEO可以改变你的商业未来:如何通过优化提升网站流量和转化率,五粮液营销推广