5月阅读周·数据结构与算法JavaScript描述 | 数组,在JavaScript中的工作原理及使用场合
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出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畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)