您的位置:首页 > Web前端 > JavaScript

js 数据引用类型(二)——数组Array

2018-01-26 22:06 531 查看
除了 Object之外,Array类型也是js中最常用的类型了。

创建数组有2种基本方式,一是Array构造函数,如

var colors=new Array(3);

二是使用数组字面量表示法,如

var colors=["red","blue","green"];
那如何检测数据类型是Array呢,使用的便是instanceof , 如

value instanceof Array == true
数组是操作数据的一大重点,因此数组本身有很多种方法用来处理数据。

(一) 转换方法

 数组属于对象,所有的对象都具有toString()、toLocalString()和valueof()方法。调用toString方法返回的是数组的字符串显示,调用valueof方法还是数组本身,而toLocalString方法跟toString方法类似,区别是它调的是数组每一项的toLocalString方法。

(二)栈方法

栈是一种LIFO(后进先出)的数据结构。push()与pop()方法使数组实现类似栈的方法,push()方法是为数组末端添加任意数量的参数,pop()方法则从数组删除最后一项。

var colors=new Array();   //创建数组
var count=colors.push("red","green"); //推入2项
alert(count); //2
var item=colors.pop(); //删除最后一项
alert(item);  //green
alert(colors.length);  //1
(三)队列方法

 队列的访问规则是FIFO(先进先出),队列在数组末端添加项,从列表的前端删除项,结合shift()与push()方法,可以像使用队列一样使用数组。shift()方法指删除数组第一项;

var colors=new Array();   //创建数组
var count=colors.push("red","green"); //推入2项
alert(count); //2
var item=colors.shift(); //删除前一项
alert(item); //red
alert(colors.length); //1
而unshift()与shift()相反,往数组前端添加一项,unshift()与pop()方法从相反的方向来模仿队列。

var colors=new Array();   //创建数组
colors.unshift("red","green"); //推入2项
alert(colors); //["red","green"]
colors.unshift("blue"); //前端推入1项
colors.pop();     //删除最后一项
alert(colors);  //["blue",red]
(四)重排序方法

reverse()与sort()方法,前者按倒序排列数组,但不够灵活;后者按照升序排列数组,但在字符串比较中,也不是最佳方案,但返回的都是数组形式。如:

reverse()
var values=[5,4,3,2,1];
values.reverse();   //1,2,3,4,5
sort()
var values=[2,4,5,8,10];
values.sort();     // 2,4,10,5,8
因此使用sort()升序的时候,我们需要采用比较两个参数的方法来处理,当第一个参数应位于第二个前面时返回-1,相等时返回0,位于后面时返回1

(sort()内部机制应该是冒泡的原理,如比较函数返回值<=0,相对位置不变;如返回值>0,相对位置改变。)

4000

function compare(a,b){
if(a<b){
return -1;
}else if(a==b){
return 0;
}else{
return 1;
}
}
var values=[1,3,7,5,15,35];
values.sort(compare); //1,3,5,7,15,35
那如何利用sort()方法来降序呢?那就是将比较函数结果反过来,参数一应位于参数二后面时返回1,相等时返回0,参数一位于参数二后面时返回-1;

(五)操作方法

concat()方法,slice()方法,splice()方法。

第一种代表的是合并,无论合并的是字符串还是数组,都将合并成一个新的数组。

var colors=["red","green"];
var colors2=colors.concat("yellow",["black","blue"]);
alert(colors); //["red","green"];
alert(colors2); //["red","green","yellow","black","blue"];
第二种代表的是复制,传入1个参数,代表的是从参数指定位置到当前数组末尾的所有项;传入2个参数,代表的是从第一个参数指定位置到第二个参数指定位置的所有项,但不包括结束位置的项(slice方法不影响原始数组)。

var colors=["red","green","yellow","black","blue"];
var colors2=colors.slice(1);
alert(colors2); //["green","yellow","black","blue"];
var colors3=colors.slice(1,4);
alert(colors3); //["green","yellow","black"];
splice方法可以算是最强大的数组方法了,它有删除,插入,替换功能。

删除,传入2个参数,第一个参数代表删除的起始位置,第二个参数代表删除的项数。例如arr.splice(0,2)会删除arr的前两个项。

插入,传入3个参数,第一个参数代表插入的起始位置,第二个参数为0,第三个参数代表的是插入项。如果要插入多个项,则可传入第四,第五等其他项。例如arr.splice(2,0,"red","blue")会从arr的第3个位置插入“red”,“blue”字符串。

替换,传入3个参数,第一个参数代表插入的起始位置,第二个参数为1,第三个参数代表的是替换项。插入项不必与删除项相等。例如arr.splice(2,1,"red","blue")会从arr删除第3个位置的项,并插入“red”,“blue”字符串。

(六)迭代方法

数组有五种迭代方法,分别为every(),filter(),map(),some(),foreach()。

every()与some()类似,都会返回true与false,区别在于every()是全部为true时才返回true,而some只要有一项为true则返回true。

var values=[1,3,5,6,8,9];
var result1=values.every(function(item,index,array){
return item>2;
});
alert(result1); //false
var result2=values.some(function(item,index,array){
return item>2;
});
alert(result2); //truefilter()可以理解为过滤,即可以返回符合某条件的一组数组。
var values=[1,3,5,6,7,9];
var result=values.filter(function(item,index,array){
return (item>2);
})
alert(result); //[3,5,6,7,9]
map()也返回一组数组,但可以实现每一项进行加工,例:
var values=[1,3,5,6,7,9];
var result=values.filter(function(item,index,array){
return item*2;
})
alert(result); //[3,5,6,7,9]
foreach类似于for循环,这一方法是不含返回值的。
(七)位置方法

顾名思义,通过返回值来判断某项处于哪个位置。有indexOf方法和lastIndexOf方法,前者是从数组的开头向后查找,后者是从数组的结尾向前查找,查不到则返回-1,传入两个参数,第一个指要查找的对象,第二个指查找的位置。

var values=[1,2,3,4,5,4,3,2,1];
values.indexOf(4); //3
values.lastIndexOf(4); //5
values.indexOf(4,4); //5(八)归并方法
指将数组的所有项进行迭代,然后构建一个最终的返回值。有reduce与reduceRight两种方法,第一种从左开始归并,第二种从右开始归并。

var values=[1,2,3,4,5];
var result=values.reduce(function(pre,cur,index.array){
return pre+cur;
});
alert(result); //15pre参数代表前一个,cur代表当前,index代表当前索引,array代表数组对象。从当前数组来看,pre代表1,cur代表2,这一过程会持续到访问每一项,最后返回结果。
reduceRight方法类似,只不过方向相反而已。

数组的八种方法也总结完毕,数据一般以数组的形式存在,掌握这8种方法,对于操作数据会有很大的把控。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: