怀英漫谈9 - JS 数组

你好,这一周,我们来聊聊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(分隔符)连接把数组转换为字符串

原文发布于微信公众号 - 怀英的自我修炼(hydzwxl)

原文发表时间:2018-04-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

Swift| 基础语法(二)

总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、数组和字典、方法的书写调用等内容,考虑到阅读体验分多...

812
来自专栏函数式编程语言及工具

Scalaz(5)- typeclass:my typeclass scalaz style-demo

  我们在上一篇讨论中介绍了一些基本的由scalaz提供的typeclass。这些基本typeclass主要的作用是通过操作符来保证类型安全,也就是在前期编译时...

2029
来自专栏猿人谷

标准库类型

一.标准string类型     string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。 1.1 strin...

1928
来自专栏曾大稳的博客

c语法进阶

不管是基本数据类型还是结构体,c都是值传递,和java不同的是,java基本数据类型是值传递,对象是引用传递。所以在c当中一般都是指针传递

1612
来自专栏刘晓杰

正则表达式

2729
来自专栏desperate633

深入理解javascript中的继承机制(3)属性复制对象之间的继承深复制原型继承原型继承与属性复制的混合使用

我们开始换一种思路实现继承,可不可以直接将父对象的属性直接复制给子对象,这样子对象不久也拥有了父对象的属性,相当于继承。

1162
来自专栏码云1024

JAVA 第二天 关键字

2897
来自专栏用户3030674的专栏

java进制转换(无视正负数的差别)

1732
来自专栏JavaEE

String类相关面试题很难?不要方,问题不大前言:一、字符串的创建:二、字符串的拼接:三、intern方法:总结:

Java中有一个String类,特别让人伤脑筋。因为它可以直接赋值,也可以new一下用构造器生成对象,还可以用加号拼接……这些不同的方式到底有什么区别?本文是个...

2175
来自专栏有趣的Python

6-Java基础语法-数组之一维数组

局部变量和数组的默认值问题: 局部变量是没有默认值的,如果没有初始化,是内存中的随机值。而数组是有默认值的0的,因为数组本身是对象。

1363

扫码关注云+社区

领取腾讯云代金券