Javascript语言精粹之Array常用方法分析

1、Array常用方法分析

1.1 Array.prototype.sort()

Javascript的默认比较函数假定被排序元素都是字符串,所以直接调用sort方法,不能正确对数字数组排序

var n=[3,11,6,23];
n.sort();
alert(n);//n: 11,23,3,6

我们可以使用自己的比较函数来进行排序,如果想要给任何简单值类型数组排序(知识点,Javascript基本数据类型不多,有string,number,boolean,undefined,null)

var m=['aa',4,'b',12,2];
m.sort(function(a,b){if(a===b){return 0;}if(typeof a === typeof b){return a<b ? -1 : 1;}return typeof a < typeof b ? -1 : 1;});
alert(m);// 2,4,12,aa,b

如果需要以对象数组的某一熟悉为关键字进行排序

var by=function(name){return function(o,p){var a,b;if(o && p && typeof o === 'object' && typeof p ==='object'){a=o[name];b=p[name];if(a===b){return 0;}if(typeof a === typeof b){return a<b ? -1 : 1;}return typeof a < typeof b ? -1: 1;}else{throw{name:'error',message:'expected an object when sorting by '+name}}}
};var s=[
{first:'moe',last:'besser'},
{first:'joe',last:'haha'},
{first:'joe',last:'abc'}
];s.sort(by('first'));s=[
{first:'joe',last:'haha'},
{first:'joe',last:'abc'},
{first:'moe',last:'besser'}
];

上述排序,发现仅按单个key排序时,

{first:'joe',last:'haha'}排在了{first:'joe',last:'abc'}
如果需要last为abc的对象排在前面,就需要基于多个key进行排序,此时可让by第二个参数为一个比较函数
var by=function(name,minor){return function(o,p){var a,b;if(o && p && typeof o === 'object' && typeof p ==='object'){a=o[name];b=p[name];if(a===b){return typeof minor === 'function' ? minor (o,p) : 0;}if(typeof a === typeof b){return a<b ? -1 : 1;}return typeof a < typeof b ? -1: 1;}else{throw{name:'error',message:'expected an object when sorting by '+name}}}
};var s=[
{first:'moe',last:'besser'},
{first:'joe',last:'haha'},
{first:'joe',last:'abc'}
];s.sort(by('first',by('last')));s=[
{first:'joe',last:'abc'},
{first:'joe',last:'haha'},
{first:'moe',last:'besser'}
];
};

1.2 Array.prototype.splice()

array.splice(start,deleteCount,item...)方法从array中移除一个或多个元素,并用新的item替换他们。start是移除元素的开始位置,deleteCount是要移除的元素个数,如有额外插入的参数,这些item将被插入到所移除元素的位置上。返回一个包含被移除元素的数组。

var a=['a','b','c'];
var r=a.splice(1,1,'ache','bug');
//a是['a','ache','bug','c']
//r是['b']

splice实现代码和详细解读

Array.prototype.splice=function(start,deleteCount){var max=Math.max,min=Math.min,delta,//偏移量
        element,insertCount=max(arguments.length-2,0),//排除掉arguments参数中,start,deleteCount,剩余是待插入元素k=0,len=this.length,//对array调用时,this指向当前数组
        new_len,result=[],//返回数组shift_count//需移位的数量;
        start = start || 0;//start默认值为0if(start<0) start+=len;//start<0时,从数组后端开始start=max(min(start,len),0);//经过处理,0<=start<=lendeleteCount=typeof deleteCount === 'number' ? deleteCount : len;//deleteCount默认值是lendeleteCount=min(deleteCount,len-start);//deleteCount<=可删除数量deleteCount=max(deleteCount,0);//0<=deleteCount<=可删除数量
    delta=insertCount-deleteCount;new_len=len+delta;//获取删除元素while(k<deleteCount){element=this[start+k];if(element!=undefined){result[k]=element;}k +=1;}shift_count=len-start-deleteCount;//待插入数量小于删除数量,原数组后续元素依次向左偏移if(delta<0){k=start+insertCount;//从start至start+insertCount留给待插入元素while(shift_count){this[k]=this[k-delta];k+=1;shift_count-=1;}this.length=new_len;}//待插入数量大于删除数量,原数组后续元素依次向右偏移else if(delta>0){k=1;while(shift_count){this[new_len-k]=this[len-k];k+1;shift_count-=1;}//this.length=new_len;非必须,因给一开始this[new_len-k]赋值时,length属性已经自动设置为数组最后元素下标值
    }//delta===0 时,待插入数量等于删除数量,无需偏移//最后将待插入元素插入原数组for(k=0;k<insertCount;k+=1){this[start+k]=arguments[k+2];//排除掉arguments参数中start和deleteCount
    }return result;
});

1.3 Array.prototype.slice()

array.slice(start,end)方法是对array中一部分做浅复制,end参数可选,默认为array.length

注意,slice方法不改变原数组,返回新的结果数组

var a=['a','b','c'];
var b=a.slice(0,1);//b是['a']
var c=a.slice(1);//c是['b','c']
alert(a);//['a','b','c']

1.4 Array.prototype.push()、Array.prototype.pop()

push、pop方法可以实现栈的先进后出。

push(item...)方法将一个或多个参数item附加到一个数组的尾部,返回数组新的长度值

var a=['a','b','c'];
var b=[1,2];
var c=a.push(b,true);
//a=['a','b','c',[1,2],true];
//c=5

push方法实现和详细解读

Array.prototype.push=function(){//对arguments对象通过array.slice方法转换成数组var args=Array.prototype.slice.apply(arguments);//通过array.concat,连接两个数组var params=[this.length,0].concat(args);//对数组调用splice方法,start=this.length,deleteCount=0,insertItems=argsthis.splice.apply(this,params);//返回新的数组lengthreturn this.length;
});
//上述步骤合并,简写为下面方式
Array.prototype.push=function(){this.splice.apply(this,[this.length,0].concat(Array.prototype.slice.apply(arguments)));return this.length;
});

pop方法移除array最后的一个元素并返回该元素,array为空时,返回undefined

var a= ['a','b','c'];
var c = a.pop();
//a是['a','b'],c是'c'

Array.prototype.pop=function(){//start=this.length-1,deleteCount=1,结果数组的第[0]个元素  return this.splice(this.length-1,1)[0];
}

1.5 Array.prototype.shift()、Array.prototype.unshift()

array.shift()方法移除数组array中第一个元素并返回该元素。数组为空时,返回undefined

var a= ['a','b','c'];
var c = a.pop();
//a是['b','c'],c是'a'

shift可以这样实现

Array.prototype.shift=function(){//start=0,deletecount=1,返回结果数组中第[0]个元素return this.splice(0,1)[0];
}

unshift将item插入array的开始部分

var a = ['a','b','c'];
var r=a.unshift('?','@');
//a是['?','@','a','b','c'];
//r是5

unshift可以像这样实现

Array.prototype.unshift=function(){//start=0,deleteCount=0,insertItems=argumentsthis.splice.apply(this,[0,0].concat(Array.prototype.slice.apply(arguments)));return this.length;
});

转载于:https://www.cnblogs.com/GongQi/p/4508880.html

Javascript语言精粹之Array常用方法分析相关推荐

  1. javascript语言精粹 微盘_JavaScript语言精粹(修订版)pdf

    摘要 "学习.理解.实践大师的思想,我们才有可能站在巨人的肩上,才有机会赶超大师,这本书就是开始." "这是一本介绍JavaScript语言本质的重要书籍,值得任何正在或 ...

  2. 《JavaScript语言精粹 修订版》 读书笔记

    之前看到这篇文章, 前端网老姚浅谈:怎么学JavaScript?,说到怎么学习JavaScript,那就是 看书.分析源码. 10本书读2遍的好处,应该大于一本书读20遍. 看书主动学习,看视频是被动 ...

  3. 《javascript语言精粹》读书笔记——函数

    这几天发现了一本好书,又薄又精辟,<JavaScript语言精粹> 看了对象.函数这两节,发现书如其名,确实是精粹. 函数的调用 函数调用的方式有四种: - 方法调用模式 - 函数调用模式 ...

  4. JavaScript语言精粹——函数(第二部分)

    九.参数 十.返回 十一.异常 十二.扩充类型的功能 十三.递归 十四.作用域 十五.闭包 十六.回调 十七.模块 十八.级联 十九.套用 二十.记忆 九.参数: 当函数被调用的时候,会得到一个 &q ...

  5. 读阮一峰对《javascript语言精粹》的笔记,我有疑问。

    <javascript语言精粹>是一本很棒的书籍,其中作者在附录列出了12种他所认为的javascript语言中的糟粕. 我最近开始跟读前端前辈的博客,其中读到了阮一峰的<12种不宜 ...

  6. 精通javascript、javascript语言精粹读书笔记

    于是选择两本书做最后的冲刺: 精通javascript(jquery之父著作),javascript语言精粹.希望我也能成为一个javascript的好手. Dom Elements的属性 精通jav ...

  7. 《JavaScript语言精粹》学习笔记(函数(2))

    <JavaScript语言精粹>学习笔记(函数(2)) 函数(Functions) 参数(Arguments) 当参数被调用时,会得到一个"免费"的参数数组argume ...

  8. 《javascript 语言精粹》精华部分

    第1章 精华 JavaScript的特性中有一部 分特性带来的麻烦远远超出它们的价值.其中,一些特性是因为规范很不完善,从而可能导致可移植性的问题:一些特性会导致生成难以理解和修改的代码:一些特 性促 ...

  9. JavaScript 语言精粹读书笔记

    最近在看 赵泽欣 / 鄢学鹍 翻译的 蝴蝶书, 把一些读后感言记录在这里. 主要是把作者的建议跟 ES5/ES5.1/ES6 新添加的功能进行了对比 涉及到的一些定义 IIFE: Immediatel ...

最新文章

  1. 夏季编辑系统的联想感觉
  2. 卵巢鸿蒙不全怎么检查,性激素六项如何看黄体功能萎缩不全
  3. Linux 删除和替换文件中某些行的方法
  4. 网站优化与网站权重息息相关
  5. python局部变量想作用于全局_python 局部和全局作用域
  6. VTK:可视化之HideActor
  7. php sodium 加密解密,sodium库(加密)
  8. [js对象]JS入门之Date对象
  9. mate30支持鸿蒙系统,Mate30不能使用GMS服务,华为P30不能通过谷歌安全认证,华为:鸿蒙系统不远了...
  10. java中的linearnumexpr,java - Cplex中的上限和下限等于0.0(在cplex中) - 堆栈内存溢出...
  11. 如何检查您的 Android 设备是否支持 Widevine DRM
  12. 赵荣人文地理学第2版笔记和课后答案
  13. 关于VO、RVO、ORCA的个人理解
  14. ssm + layui + poi+ 自定义注解 + java反射 做条件导出Excel 工具类
  15. 骨传导耳机推荐,2021骨传导耳机排行榜
  16. 如何使用手机把照片压缩到100K?教你手机压缩方法
  17. ModSecurity web application firewall (WAF) Research - .Little Hann
  18. Wi-Fi Display
  19. 五大经典算法-动态规划 及其算法应用
  20. 图像的匹配、配准、融合、拼接等概念的区别

热门文章

  1. Genymotion安装那些事
  2. 在线ASCII流程图编辑器工具
  3. 在线等差数列项生成器
  4. 刘徽割圆法转化成matlab,刘徽割圆术动画演示
  5. 4.3. aliases
  6. 非对称网络不通 子网掩码是“祸首”
  7. 《中国人工智能学会通讯》——11.34 基于近似动态规划的优化控制研究及 在电力系统中的应用...
  8. 用C/C++写CGI程序
  9. fuser命令使用说明
  10. 551. 学生出勤记录 I