数据结构之数组

阅读文本大概需要 12 分钟。

程序员可能都听说过:算法 + 数据结构 = 程序。今天就来了解下数据结构的其中一种——数组吧。

数组的标准定义是:一个存储元素的线性集合。许多编程语言都有相应语法的数组,而在 JavaScript 中,数组其实是一种特殊的对象。

数组的创建与读写

以下两种方式都可创建数组:

值得注意的是,JavaScript 中的数组数据可以是不同类型,它的语法相对宽松,例如可以指定不同类型数据另外,可以通过来判断一个对象是否是数组,例如:

如何读写数组呢?可以使用循环。

数组的深复制与浅复制

当我们把数组赋给另外一个数组,然后改变其中一个数组的值,另一数组也会随之改变,这就是数组的浅复制。而深复制指的就是不改变原来的数组而去创建一个新的数组,这种情况是经常使用的,为了不破坏原数组。下面的代码展示了这两种复制

存取函数

JavaScript 提供了一组用来访问数组元素的函数,叫存取函数。最常用的存取函数就是 indexOf() 函数,该函数返回指定查找的值在目标值中是否存在,如果存在,返回该值在数组中的索引,不存在则返回 -1。

除此之外,还有 join 和 toString 函数,concat 和 splice 函数。前两个函数可以将数组转化为字符串,后面两个函数可以通过已有的数组创建新数组,其中 concat 方法通过合并多个数组来形成新数组,而 splice 方法是截取一个数组的子集作为一个新数组。它们的使用示例如下

可变函数

不去引用数组中的某个元素,就能改变数组内容,这种函数称它为可变函数。

push() 和 unshift()、pop() 和 shift()

push() 方法可以在数组末尾添加元素,而 unshift() 方法可以在数组开头添加元素;相对应的,pop 可以删除数组末尾的元素,而 shift 删除数组的第一个元素。

splice()、sort()、reverse()

前面提到的 splice 不仅可以用来删除元素,还可以添加元素进数组。用 sort 可以为数组排序,reverse 将数组内的元素翻转。

关于 sort 方法非常有意思,它只能对那些字符串类型的元素排列得比较准确,但如果是数字,结果就不那么令人满意了。看看例子.

那如何解决这种排序的错误呢?方法就是在调用 sort() 的时候传入一个函数,该函数可以比较出大小。

可以看到,已经排序正确了,compare 函数就是利用了两数相减,如果结果为正,那么被减数大于减数,如果结果为 0,则两数相等,而如果结果为负,说明被减数小于减数。

迭代器方法

迭代函数通过对数组中的元素逐个应用,来操作返回相应的值。

不返回新数组的 forEach() 、every()、some()、reduce()

返回新数组的 map() 和 filter()

map 的作用与 forEach 是一样的,区别就是 map 函数返回的是一个新数组。

而 filter 和 every 相似,区别在于当所有的元素使改函数为 true 时,它并不返回布尔类型,而是返回一个新数组。下面这个例子十分有趣,它随机产生10个 0 到 100 的数字作为分数,然后把大于 60 的及格分数筛选出来。

上述代码的输出结果为

随机产生的 10 个同学的分数为:

21, 4, 89, 45, 5, 51, 71, 7, 46, 53, 47

及格的分数有:

89, 71

二维数组

JavaScript 可以通过在数组里在嵌套一个数组来形成二维数组。

处理二维数组

对于二维数组的处理可以分为两种,一种按列访问,一种是按行访问。

按列访问,外层循环对应行,内层循环对应列。例如,上述的数组,每一行对应一个学生的成绩记录,可以通过相加所有成绩,然后除以科目数来得到该生的平均成绩。

上述代码的输出结果为

student 1 average: 85.33

student 2 average: 85.33

student 3 average: 76.00

对于按行访问,则外层循环对应列,内城循环对应行,例如还是上述数组,现在的数组表示一个学生各科的分数,我们来求其平均成绩

输出结果为:

exam 1 average: 85.33

exam 2 average: 80.00

exam 3 average: 81.33

其实只要调整 for 循环的顺序就可以控制是按行还是按列来输出,此外,JavaScript 还可以处理一些参差不齐的数组,比如一个二维数组中的数组,有的是两个元素,有的是四个元素,并不是都相同,在这种情况下,JavaScript 依然可以处理运行而不报错,这是因为不管多或少,都可以通过 length 属性来计算。

对象数组

如果你有阅读到这里,你应该可以发现上面的所有例子里数据类型都是基本数据类型,不是数字就是字符串。对象数组,顾名思义,就是数组里面的元素可以是对象,这个与 java 的语法很相似,基本上所有的编程语言都是相通的。看看下面这个例子:

上述程序的输出结果为:

Point 1: 1, 2

Point 2: 2, 4

Point 3: 8, 1

Point 4: 2, 9

也可以用之前的 puh() 等操作方法来操作对象数组

输出结果为:

添加了 p5 后:

1,2

2,4

8,1

2,9

11,13

删除第一个元素后:

2,4

8,1

2,9

11,13

以上,关于 JavaScript 数组知识点的总结,如果你有什么补充或发现什么错误,欢迎后台留言交谈哦!

「Stay hungry,stay foolish.」

关注、点赞、转发走一波!

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180709G1NWS700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券