JavaScript数据结构与算法(一):数组

一.编程世界中的数组

数组,我们再熟悉不过了,任何一种语言都包含数组,只是形式上略有不同。所有编程语言中,都会有数组这一数据类型。不过,数组不仅仅是数据类型,还是计算机编程世界里最常见的数据结构。数组是编程语言中的内建类型,通常效率很高。可以满足不同需求的数据存储。


二.数组的定义

数组的标准定义是:一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。专业解释是:一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。数组有两个关键词:【线性集合】和【连续内存空间】。

线性集合:

顾名思义,就是排成一条线一样的集合,每个集合上的数据只有前后之分。除了数组,栈,队列,链表等也是线性表结构。与线性结构相对立的是非线性结构,就是不是排成一条直线的数据集合。二叉树,堆,图等就是非线性表结构。

连续内存空间:

指的是内存地址的分配是连续的。根据首内存地址可以计算出集合中其他元素的内存地址。正式基于这个特性,数组具有"可随机访问性"。数组的中元素的寻址公式是:a[k]_address = base_address + k * type_size 。


三.数组的方法

1.存取函数

JavaScript 提供了一组用来访问数组元素的函数,叫做存取函数,这些函数返回目标数组的某种变体。

1.1. indexOf()

indexOf() 函数是最常用的存取函数之一,用来查找传进来的参数在目标数组中是否存在。 如果目标数组包含该参数,就返回该元素在数组中的索引;如果不包含,就返回 -1。

1.2. 数组的字符串表示

有两个方法可以将数组转化为字符串:join() 和 toString()。这两个方法都返回一个包含 数组所有元素的字符串,各元素之间用逗号分隔开。

1.3. 由已有数组创建新数组

concat() 和 splice() 方法允许通过已有数组创建新数组。concat 方法可以合并多个数组 创建一个新数组,splice() 方法截取一个数组的子集创建一个新数组。


2.可变函数:

JavaScript拥有一组可变函数,使用它们,可以不必引用数组中的某个元素,就能改变数组内容。这些函数常常化繁为简,让困难的事情变得容易。

2.1. 为数组添加元素

有两个方法可以为数组添加元素:push() 和 unshift()。push() 方法会将一个元素添加到数组末尾,unshift() 方法会将一个元素添加到数组开头。

2.2. 从数组中删除元素

使用 pop() 方法可以删除数组末尾的元素,shift() 方法可以删除数组的第一个元素。

2.3. 从数组中间位置添加和删除元素

删除数组中的第一个元素和在数组开头添加一个元素存在同样的问题——两种操作都需要将 数组中的剩余元素向前或向后移,然而 splice() 方法可以帮助我们执行其中任何一种操作。使用 splice() 方法为数组添加元素,需提供如下参数:

  • 起始索引(也就是你希望开始添加元素的地方);
  • 需要删除的元素个数(添加元素时该参数设为 0);
  • 想要添加进数组的元素。
2.4. 为数组排序

第一个方法是 reverse(),该方法将数组中元素的顺序进行翻转。如果元素是字符串类型, sort()方法可将数组中的元素按照字典方法排序


3.迭代器方法:

这些方法对数组中的每个元素应用一个函数,可以返回一个值、一组值或者一个新数组。

3.1. 不生成新数组的迭代器方法
  1. forEach()——该方法接受一个函数作为参数,对数组中的每个元素 使用该函数。
  2. every()——该方法接受一个返回值为布尔类型的函数,对数组中的每 个元素使用该函数。如果对于所有的元素,该函数均返回 true,则该方法返回true。
  3. some()——该方法也接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回 true, 该方法就返回true。
  4. reduce() ——该方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。
  5. JavaScript 还提供了 reduceRight() 方法,和reduce() 方法不同,它是从右到左执行。
3.2. 生成新数组的迭代器方法

有两个迭代器方法可以产生新数组:map() 和 filter()。map() 和 forEach() 有点儿像,对数组中的每个元素使用某个函数。两者的区别是 map() 返回一个新的数组,该数组的元素是对原有元素应用某个函数得到的结果。


总结

avaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串。数组在 JavaScript 中只是一种特殊的对象,所以效率上不如其他 语言中的数组高。
JavaScript 中的数组,严格来说应该称作对象,是特殊的 JavaScript 对象,在内部被归类为数组。由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用。

数组是最简单,最基础的数据结构。
数组用用一块连续的内存空间,来存储相同类型的一组数据,最大的特点就是支持随机访问。但是插入,删除操作也因此变得比较低效,平均时间复杂度为O(n)

你可能感兴趣的:(算法,数据结构,算法,javascript)