之前就想整理一下关于数组的方法,因为数组的方法有很多,使用也很频繁。特别是手动截取字符串,页面重新排序的时候。
关于Array
在js的数组中,每一项可以保存成任意数据类型。也就是说可以第一项是字符串,第二项是数值,第三项是一个对象。
创建一个数组
- 使用构造函数的方法:1var colors = new Array();
也可以用这个方法直接指定数组的长度:
|
|
还可以直接给数组内部加入数据:
|
|
- 使用数组字面量的方法:1var colors = [];
直接在数组内添加数据:
|
|
访问数组
- 访问数组内部的值
通过 []
里面加上数字索引去访问,从0开始
|
|
- 数组的长度
|
|
数组长度是从1开始数的,所以最大长度比最大的索引会大1,这样也方便了直接在最后一位添加数据:
|
|
检测数组
检查一个变量是不是数组,方法有两种
ES3中使用instanceof
方法去判断,返回一个boolear
|
|
ES5后使用Array.isArray()
方法去判断,返回一个boolear
|
|
ES3中的方法会导致在不同执行环境下,创建的数组会有各自不同的够构造函数,在ES5中解决了
转换方法
将数组转成字符串:
|
|
join()
toString()
和toLocaleString()
方法都会将数组转成字符串,用逗号隔开,如果要选用自己喜欢的符号去隔开,那么要采用join()
方法。方法会返回从组后的字符串
|
|
可以是任意的字符串去隔开
栈方法
提供了push()
和pop()
方法,以便实现栈的行为。
push()
push()
方法可以接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度。
|
|
pop()
pop()
方法从数组末尾移除最后一项,减少数组的length
值,然后返回移除的项。
|
|
队列方法
队列在列表的末端添加项,从列表的前端移除项。
shift()
移除数组第一项,并返回第一项的值
|
|
unshift()
它能在数组前端添加任意项,并返回长度
|
|
在IE7下面unshift()
会总是返回undefined,IE8在非兼容模式下回返回正确长度
重排序方法
数组中已经存在两个可以直接用的重排序的方法:reverse()
和sort()
reverse()
会将数组现在的顺序颠倒,然后返回重新排序后的数组
|
|
sort()
默认将数组数组转成字符串,然后从小到大进行排序,然后返回一个重新排序后的数组
|
|
这样显然和想象中的不一样,因为上面是直接进行的字符串的比较,而不是数值类型的比较。可以给sort()
传入一个方法,返回数值类型
|
|
从小到大是return a - b
,从大到小是return b - a
其实我比较推荐ES6的箭头函数,更简洁
|
|
操作方法
js中对数组的操作还有很多方法
concat()
concat
方法可以基于当前数组中的所有项创建一个新数组。此方法会创建一个副本,然后返回重组的新数组,并不会对原数组进行操作
|
|
slice()
slice()
方法接收两个参数,第一个为必填:返回项的起始位置,第二个可选:结束位置。如果没有第二个参数,则默认从起始位置到结束。截取位置计算方法是>=起始位置,<结束位置
。方法最后返回截取的这段数组
|
|
如果传值为负数,那么就用数组的length
加上它,作为参数来计算。如果结束位置小于起始位置,则返回空数组。
splice()
- 有3种用法
- 删除:
- 指定两个参数,第一个参数:删除的起始位置,第二个参数:要删除的项数。如
splice(0,2)
会删除前面2项。
- 指定两个参数,第一个参数:删除的起始位置,第二个参数:要删除的项数。如
- 插入:
- 可以指定位置插入任意数量的项,指定三个参数,第一个参数:起始位置,第二个参数:0(删除0项),第三个参数:插入的内容。可以插入多项,比如
splice(1,0,'hello','world')
从索引为1的地方开始插入’hello’和’world’。
- 可以指定位置插入任意数量的项,指定三个参数,第一个参数:起始位置,第二个参数:0(删除0项),第三个参数:插入的内容。可以插入多项,比如
- 替换:
- 结合前面两条可以得到此项,比如从起始位置删除2条,再加入2条,就成了替换了
splice(1,2,'hello','world')
- 结合前面两条可以得到此项,比如从起始位置删除2条,再加入2条,就成了替换了
- 删除:
splice()
会返回删除的数组
|
|
位置方法
ES5为数组实例添加了两个位置方法:indexOf()
和lastIndexOf()
。这两个方法接收两个参数:要查找的项和(可选的)表示查找位置起点的索引。
在没有找到的情况下会返回-1
,在比较参数的时候会使用全等
,也就是用===
进行比较
indexOf()
重数组开头查找,然后返回查找到的第一个字符在数组中的位置
|
|
迭代方法
ES5数组定义了5个迭代方法:
- every()
- filter()
- forEach()
- map()
- some()
这些方法会接收3个参数:
- 数组的值
- 该项在数组中的位置
- 数组对象本身
every()
对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true
|
|
some()
对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true
|
|
some()
和every()
比较像,一个是有一项返回true则返回true,一个必须所有都为true,则返回true
filter()
对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
|
|
这个方法对查询符合某些条件的所有数组项非常有用
map()
对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
|
|
这个方法适合创建包含的项与另一个数组一一对应的数组
forEach()
对数组中的每一项运行给定函数,这个方法没有返回值
|
|
支队数组中的每项运行传入的函数,和for
类似
归并方法
ES5新增的两个归并方法:reduce()
和reduceRight()
。这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。
reduce()
是从第一项开始操作,而reduceRight()
是从最后一项开始操作。
- 他们的函数会接收4个参数:
- 前一个值
- 当前值
- 项的索引
- 数组对象
这个函数返回的任何值都会作为第一个参数自动传给下一项
第一次运算会从第二项开始,第一项的值会作为前一个值
来运算
|
|
number最后值为4,比数组的length少1