你好,这一周,我们来聊聊JS的数组。
所谓的数组,就是一些数据的集合,JS中没有集合的概念,所以集合也是数组的一种。如果你Java用的多,那么这个概念就有点儿难以理解,毕竟从Java的文意来说,集合的范围要远远高于数组。不过这是在JS中,那只能入乡随俗了。
就我目前的开发而言,数组用的多的方法是增、删、查。这其中又以查用的最多。你可可能想要问我“修改”这个功能去了哪里,其实修改这个功能我倒是觉得这是个伪命题,为什么这么说呢?因为数组修改的本质是先定位需要修改的那个数据,即得到那个数据的下标,然后再给那个下标重新赋值就可以了。这么一来,与修改这个操作等价的操作就是查找+重新赋值。
在数组的这些个方法中,我们先来说说“查”这个方法,在开发中最常遇到的需求是,知道一个数组的元素,但我想知道这个元素在这个数组中的位置。比如一个名字叫week的数组['星期一','星期二','星期三','星期四','星期五','星期六','星期7'],其中'星期7'这个元素我填写错了,我现在想要将它改为'星期日',这个时候我就要先去查找它,然后再将这个下标下的值改为'星期日',此时的查找我通常会用indexOf()函数,直接祭出代码indexOf('星期7');就能得到想要的下标了。
此时,如果你问我除了indexOf()这个方法,还有其它的方法么?之前开发的时候,我还真的只知道这一种方法,不过聊天之前,我查了一下API,发现indexOf的本质是遍历数组,所以,用遍历数组的方式也能做,不过那样话,就会比较麻烦。需要自己定义位置的标记,然后还需要自己去实现比较。通常在效率第一的前提下,很少这样用。
其实从某种程度上来说,indexOf()这个方法是对遍历的一种封装。数组的遍历,有foreach(), map(), reduce()三种。reduce()属于迭代器的操作,说实话,用的少,对其的了解也并不深,foreach()倒是常用,它和map()的区别是,foreach()操作的是原有的数组,而map()对原有的数组没有改变。而且这两个遍历方法的核心所在是它们callback函数的参数列表,(item,index,array),item指目前遍历的这个下标的元素,index是目前遍历的这个下标,array是整个数组。这三个参数列表决定了每一个元素被遍历到的时候所做的操作,所以会格外的重要。
说完了排序,下一个要说的就是数组的增和删了,我长用的增添的方法是push(),删除的方法pop(),push()方法是增添第一个元素,pop()方法是删除最后一个元素。与其对应的还有两个方法,我对他们也不是很熟悉,就不做介绍了。
不过与其相关的还有一个方法splice()能做到在任意的位置添加,删除,替换数组元素,这个方法至少要传入2个参数,第一个参数要被添加、删除、替换元素的索引位置,第二个是要删除多少个元素,第三个是要添加的元素。这样一来,通过这三个参数的不同组合,就能达到添加、删除、替换的不同效果。比如有一个数组arr=[1,2,3]; 。如果想要替换索引1的元素,就可以这么写arr.splice(1, 1, 12);,即在索引1的位置删除1个元素,新添一个元素12,返回[1,12,3],达到替换的效果。如果想要添加一个元素,那么可以这么写arr.splice(1, 0, 123); ,即在索引1的位置,删除0个元素,,新增一个元素123,返回[1,123,2,3],从而达到增添的效果。如果想要删除一个元素,那么可以这么写arr.splice(1,1);,即在索引为1的位置,删除1个元素,不增添新的元素,返回[1,3],从而达到删除的效果。
除了这些常用的方法之外,其它的还有一些增强型的方法,比如数组排序,数组合并等,我列在下面,如有兴趣,可以去w3c上瞅一眼。
清 单
arr.indexOf(element[,beginIndex]); | 查找 |
---|---|
arr.forEach(callback); | 遍历(对原数组有改变) |
arr.map(callback) | 遍历(对原数组没有改变) |
arr.reduce(callback[,initialValue]) | 遍历(迭代器方式) |
arr.reverse() | 反转数组元素顺序 |
arr.sort([function]) | 排序 |
arr.push(ele1,ele2….) | 向数组结尾后面添加新的元素 |
arr.unshift(ele1,ele2…) | 向数组开始前面添加新的元素 |
arr.shift() | 从数组中取出该数组的第一个元素 |
arr.pop() | 从数组中取出该数组的最后一个元素 |
arr.splice(index,howMany[,ele1…]) | 在任意位置添加、删除、替换数组的元素 |
arr.slice(begin,end) | 拷贝 |
arr.concat(value1,value2…) | 合并数组 |
arr.join(separator) | 数组通过separator(分隔符)连接把数组转换为字符串 |