Array类型综合知识概述:
检测数组:
Array.isArray():
为了解决网页中包含多个框架出现两个以上不同的全局执行环境,导致存在两个以上不同版本的Array构造函数,通过instanceof操作符无法准确检测数组,
Es5解决了这个问题,新增Array.isArray()方法来检测数组。
转换方法:
join();
数组继承的toLocalString()、toString()、valueOf()方法,在默认情况下都会以逗号隔开的字符串形式返回数组项,
使用join()方法,接收不同的分隔符作为参数可以构建不同分隔符分割的数组字符串形式。
用数组模仿其他数据结构的方法:
(1)栈方法:后进先出
push():将项逐个添加到数组末尾;
pop():从数组末尾移除最后一项
(2)队列方法:先进先出
①正向队列:
shift() :移除数组中的首项并返回该项;
push()
②反向队列:
pop()
unshift():在数组前端添加任意个项,并返回新数组的长度。
------------------------------------------------------------------其他数据结构的模仿方法待续!
重排序方法:
(1)reverse():
基于数组位置来进行简单的倒序反转后返回反转的数组
(2)sort():
①默认按升序排列数组项(调用了toString方法,得到的是字符串大小进行比较,而不是数值比较)
②接收一个比较函数作为参数来实现按数值比较排列数组
比较函数:
function compare(value1,value2){
if(value1<value2){
return -1;
} else if(value1>value2){
return 1;
} else{
return 0;
}
}
传入sort()方法即可实现从小到大排序。若实现从大到小排序,把返回值互调则行
简写方法:对于数值类型或者其valueOf()会返回数值类型的对象类型,则可以使用如下比较函数:
function simpleCompare(value1,value2){
return value2-value1;
}
拓展:当一个数组里面的每个项都是对象时,若此时要根据对象的某个属性进行为对象项排序时可使用以下方法:
if语句中比较的内容应该改为对象的属性,即value1.属性<value2.属性的形式即可
另外要是要求某个属性相等的话则按另一个属性大小进行排序,可使用比较函数的嵌套方法如下:
此时也可以把上列比较函数封装为一个函数如:
function createComparisonFunction(propertyName){
return function(object1,object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
}
}
var data = [{name:'liao',age:22},{name:'ye',age:21}];
data.sort(createComparisonFunction('age'))
console.log(data[0].name); // ye
console.log(data[1].name); // liao
操作方法:
1.concat():创建当前数组的一个副本,后将接收到的参数添加到这个副本的末尾,无参数后追则简单返回新构建的数组,如追加的参数为数组,则将数组每一项依次添加。
var words = ['a','b','c'];
var words2 = words.concat('d',['e','f']);
alert(words); //a,b,c
alert(words2); //a,b,c,d,e,f
2.slice():基于当前数组中的一或多个项创建一个新数组。参数是基于0开始计算的。
(1)接收两个参数:指定开始位置,指定结束位置(不包括结束位置)
(2)接收一个参数:指定开始位置,结束位置默认为当前数组末尾项的下一项。
var words = ['a','b','c','d','e'];
var words2 = words.slice(2);
var words3 = words.slice(2,4);
alert(words2); //c,d,e
alert(words3); //c,d
3.splice():全能方法,主要用途是想数组的中部插入项
(1)删除功能: 指定两个参数 ①要删除的第一项的位置 ②要删除的项数 如splice(0,2)会删除数组前两项;
(2)插入功能:指定三个参数 ①起始位置 ②0(要删除的项数)③要插入的项(可累加) 如splice(2,0,'e','f')会从数组的位置2开始插入字符'e'和'f‘
(3)替换功能:指定三个参数:①起始位置 ②要删除的项数 ③要插入的任意数量的项,注意,插入的项数不必与删除的项数相等。过程是先删除相对项,然后在该项的位置开始插入新项。
总结:上面的三个功能实质是三个参数位的配合使用,只需要记住一点参数①是操作的起点,参数②是要从参数①位置开始删除的项数,参数③是要插入参数①位置的新项
位置方法:
(1)indexOf():返回查找项的位置(存在),返回-1(不存在),特点:使用全等操作符
接收两个参数:①要查找的项内容 ②查找起点位置的索引(可选)
(2)lastIndexOf():从数组末尾开始查找
迭代方法:接收两个参数:①要在每一项上运行的函数 ②运行该函数的作作用域对象(可选的)
另外,传入的参数①函数中接收三个参数:①数组项的值,②该项在数组中的位置,③数组对象本身
即迭代方法(参数①函数function(数组项的值,该项在数组中的位置,数组对象本身),可选的运行该函数的作用域对象)
(1)every():对数组每一项运行给定函数,若函数对每一项都返回true,则返回true;
(2)filter(): ~~~~同上,返回会返回true的项的数组;
(3)forEach():~~~~同上,这个方法没有返回值
(4)map():~~~~同上,返回每次函数调用的结果的数组(注意:不是项名称数组,而是对项调用函数得出的结果的数组)
(5)some(): ~~~~同上,若其中有一项返回true,则返回true
总结:every()和some()相似,都返回布尔值,前者是与的关系,后者是或的关系
filter()和map()都会返回数组,前者是返回会返回ture的对应项的名称的数组,后者则是返回数组每项在调用函数中得出的结果的数组
forEach()是日常比较常用的方法,只是简单对每个项进行函数调用,而不返回任何值。
归并方法:迭代数组的所有项,然后构建一个最终返回的值
接收两个参数:①一个在每一项上调用的函数,②(可选的)作为归并基础的初始值,
另外参数①函数接收四个参数:①前一个值,②当前值,③项的索引值,④数组对象
(1)reduce():正向迭代
(2)reduceRight():反向迭代
栗子:
var value = [1,2,3,4,5];
var sum - values.reduce(function(pre,cur,index,array){
return prev = cur;
});
alert(sum);//15