5月阅读周·数据结构与算法JavaScript描述 | 数组,在JavaScript中的工作原理及使用场合

举报
叶一一 发表于 2024/05/27 09:13:45 2024/05/27
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读三个月。4月份的阅读计划有两本,《你不知道的JavaScrip》系列迎来收尾。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《...

背景

去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。

没有计划的阅读,收效甚微。

新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。

这个“玩法”虽然常见且板正,但是有效,已经坚持阅读四个月。

已读完书籍《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》

当前阅读周书籍《数据结构与算法JavaScript描述》

数组

JavaScript中对数组的定义

数组的标准定义是:一个存储元素的线性集合(collection),元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。

JavaScript中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。然而,这些数字索引在内部被转换为字符串类型,这是因为JavaScript对象中的属性名必须是字符串。数组在JavaScript中只是一种特殊的对象,所以效率上不如其他语言中的数组高。

使用数组

创建数组

1、最简单的方式是通过[]操作符声明一个数组变量:

var numbers = [];

2、在声明数组变量时,直接在[]操作符内放入一组元素:

var numbers = [1, 2, 3, 4, 5];
print(numbers.length); // 5

3、调用Array的构造函数创建数组:

var numbers = new Array();
print(numbers.length); // 0

4、为构造函数传入一组元素作为数组的初始值:

var numbers = new Array(1, 2, 3, 4, 5);
print(numbers.length); // 5

5、在调用Array的构造函数时,可以只传入一个参数,用来指定数组的长度:

var numbers = new Array(10);
print(numbers.length); // 10

判断数组

可以调用Array.isArray()来判断一个对象是否是数组,如下所示

var numbers = 3;
var arr = [7, 4, 1776];
print(Array.isArray(numbers)); // 显示false
print(Array.isArray(arr)); // 显示true

读写数组

在一条赋值语句中,可以使用[]操作符将数据赋给数组,如下所示:

var nums = [];
for (var i = 0; i < 100; ++i) {
  nums[i] = i + 1;
}

可以使用[]操作符读取数组中的元素,如下所示:

var numbers = [1, 2, 3, 4, 5];
var sum = numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4];
print(sum); // 15

由字符串生成数组

调用字符串对象的split()方法也可以生成数组。该方法通过一些常见的分隔符,比如分隔单词的空格,将一个字符串分成几部分,并将每部分作为一个元素保存于一个新建的数组中。

var sentence = '0,1,2';
var numList = sentence.split(',');
console.log(numList); // [ '0', '1', '2' ]

存取函数

查找元素

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

var names = ['David', 'Cynthia', 'Raymond', 'Clayton', 'Jennifer'];
var name = 'Cynthia';
var position = names.indexOf(name);
if (position >= 0) {
  console.log('Found ' + name + ' at position ' + position);
} else {
  console.log(name + ' not found in array.');
}
// Found Cynthia at position 1

数组的字符串表示

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

var names = ['David', 'Cynthia', 'Raymond', 'Clayton', 'Mike', 'Jennifer'];
var namestr = names.join();
console.log(namestr); // David, Cynthia, Raymond, Clayton, Mike, Jennifer
namestr = names.toString();
console.log(namestr); // David, Cynthia, Raymond, Clayton, Mike, Jennifer

二维和多维数组

创建二维数组

二维数组类似一种由行和列构成的数据表格。在JavaScript中创建二维数组,需要先创建一个数组,然后让数组的每个元素也是一个数组。最起码,我们需要知道二维数组要包含多少行,有了这个信息,就可以创建一个n行1列的二维数组了:

Array.matrix = function (numrows, numcols, initial) {
  var arr = [];
  for (var i = 0; i < numrows; ++i) {
    var columns = [];
    for (var j = 0; j < numcols; ++j) {
      columns[j] = initial;
    }
    arr[i] = columns;
  }
  return arr;
};
var nums = Array.matrix(3, 2, 1);
console.log(nums);// [ [ 1, 1 ], [ 1, 1 ], [ 1, 1 ] ]

处理二维数组的元素

处理二维数组中的元素,有两种最基本的方式:按列访问和按行访问。

对于两种方式,我们均使用一组嵌入式的for循环。对于按列访问,外层循环对应行,内层循环对应列。以数组grades为例,每一行对应一个学生的成绩记录。我们可以将该学生的所有成绩相加,然后除以科目数得到该学生的平均成绩。

var grades = [
  [89, 77, 78],
  [76, 82, 81],
  [91, 94, 89],
];
var total = 0;
var average = 0.0;
for (var row = 0; row < grades.length; ++row) {
  for (var col = 0; col < grades[row].length; ++col) {
    total += grades[row][col];
  }
  average = total / grades[row].length;
  console.log('Student ' + parseInt(row + 1) + ' average: ' + average.toFixed(2));
  total = 0;
  average = 0.0;
}

打印结果:

Student 1 average: 81.33
Student 2 average: 79.67
Student 3 average: 91.33

对象数组

在对象中,可以使用数组存储复杂的数据。

我们创建了一个对象,用于保存观测到的周最高气温。该对象有两个方法,一个方法用来增加一条新的气温记录,另外一个方法用来计算存储在对象中的平均气温。代码如下所示:

function weekTemps() {
  this.dataStore = [];
  this.add = add;
  this.average = average;
}

function add(temp) {
  this.dataStore.push(temp);
}

function average() {
  var total = 0;
  for (var i = 0; i < this.dataStore.length; ++i) {
    total += this.dataStore[i];
  }
  return total / this.dataStore.length;
}

var thisWeek = new weekTemps();
thisWeek.add(52);
thisWeek.add(55);
thisWeek.add(61);
thisWeek.add(65);
thisWeek.add(55);
thisWeek.add(50);
thisWeek.add(52);
thisWeek.add(49);
console.log(thisWeek.average()); // 54.875

add()方法中用到了数组的push()方法,将元素添加到数组dataStore中。

总结

数组是编程语言中的内建类型,通常效率很高,可以满足不同需求的数据存储。本文主要探索JavaScript中数组的工作原理,以及它的使用场合。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。