JavaScript——多维数组
常见二维数组操作
创建
使用Array对象创建
方法类似于创建一维数组,不过要将数组元素设置为数组;
var info = new Array(new Array('Tom', 15, 160), new Array('Lucy', 16, 155));
var empty = new Array(new Array, new Array); //空二维数组
直接使用“[ ]”创建
var info = [[1, 2], [3, 4]];
var empty = [[], []]; //空二维数组
通过多维空数组添加元素的方法创建
var arr = []; //创建一个空数组
for (var i = 0; i < 3; ++i) {
arr[i] = []; //将当前数组的元素设置为数组
arr[i][0] = i; //为二维数组赋值,“0”数组是下标
...
}
遍历
二维数组只需在遍历数组后,再次遍历数组的元素,即可获取二维数组的元素值;
// 二维数组的求和
var arr = [[12, 59, 66], [100, 888]];
var sum = 0;
for (var i in arr) { //遍历数组的行
for (var i in arr[i]) { //遍历数组的列
sum += arr[i][j]; //二维数组元素累计相加
//例如arr[0]就是[12, 59, 66],arr[0][1]就是59
}
}
console.log('二维数组求和等于' + sum);
二维数组转置
二维数组的转置就是将二维数组的横向元素保存为纵向元素,即列变为行,行变为列。设转置前的数组为arr,转置后的数组为res,那么就有arr[i][j]=res[j][i],且res数组的长度等于arr元素的长度,res元素的长度等于arr数组的长度;
- 转置前arr
[
[‘a’, ‘b’, ‘c’],
[‘d’, ‘e’, ‘f’],
[‘g’, ‘h’, ‘i’],
[‘j’, ‘k’, ‘l’],
] - 转置后res
[
[‘a’, ‘d’, ‘g’, ‘j’],
[‘b’, ‘e’, ‘h’, ‘k’],
[‘c’, ‘f’, ‘i’, ‘l’],
]
具体示例如下:
// An highlighted block
var arr = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l']];
var res = [];
for (var i = 0; i < arr[0].length; ++i) { //遍历res中的所有元素
res[i] = [];
for (var j = 0; j < arr.length; ++j) { //遍历res元素中的所有元素
res[i][j] = arr[j][i]; //转置
}
}
//输出
console.group('转置前:');
console.log(arr);
console.groupEnd();
console.group('转置后:');
console.log(res);
console.groupEnd();
效果如图所示:
数组排序
在开发中为了避免许多不必要的麻烦,在数组中进行定位时,经常需要将数组元素的值转化为一个有序的排列。例如,使用二分法查找数据时,就必须是对一个有序排列的数组进行;
冒泡排序、
- 冒泡排序是较为简单的排序算法,其原理是不断比较数组中相邻两个元素的值,较小或者较大的元素前移,以实现从小到大/从大到小的顺序排列;
- 冒泡排序比较的轮数是数组长度减1,每轮比较的对数等于数组长度减当前轮数;
- 示例:实现从小到大的顺序排列
var arr = [10, 2, 5, 27, 98, 31];
console.log('待排序数组: ' + arr);
for (var i = 1; i < arr.length; ++i) { //控制需要比较的轮数
for (var j = 0; j < arr.length - i; ++j) { //控制每轮比较中参与比较的元素的对数
if (arr[j] > arr[j + 1]) {
//比较相邻元素,如果要实现从大到小排列,只需令arr[j] < arr[j + 1]
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; //换位赋值
}
}
}
console.log('排序后的数组: ' + arr);
插入排序
- 插入排序是冒泡排序的优化,是一种直观的简单排序算法,其原理是通过构建有序数组的存储,对未排序的数组元素,在已排序的数组中从最后一个元素向第一个元素遍历,为各元素找到相应的位置并插入;
- 插入排序的比较次数与无序数组长度相等,每次都会有一个无序数组的元素与有序数组中的所有元素进行比较,比较之后找到合适的位置插入,最终得到一个有序数组;
- 示例:实现从小到大的顺序排列,我们假设arr[0]为有序数组,其余元素在一起是一个无序数组
var arr = [89, 56, 100, 21, 87, 45, 1, 888];
console.log('待排序数组: ' + arr);
for (var i = 1; i < arr.length; ++i) { //遍历无序数组下标
for (var j = i; j > 0; --j) {
//遍历并比较一个无序数组元素与所有有序数组元素
if (arr[j - 1] > arr[j]) {
//比较相邻元素,如果要实现从大到小排列,只需令arr[j - 1] < arr[j]
[arr[j - 1], arr[j]] = [arr[j], arr[j - 1]]; //换位赋值
}
}
}
console.log('排序后的数组: ' + arr);
常见数组方法
栈和队列方法
我们可以利用Array对象提供的方法实现在数组的末尾/开头添加/移除数组元素;
方法名称 | 功能描述 |
---|---|
push() | 将一个或多个元素添加到数组末尾,并返回数组的新长度 |
unshift() | 将一个或多个元素添加到数组开头,并返回数组的新长度 |
pop() | 从数组末尾移除并返回一个元素,空数组返回undefined |
shift() | 从数组开头移除并返回一个元素,空数组返回undefined |
示例:
var arr = [1, 3, 5];
var last = arr.pop();
console.log(last); //5
var first = arr.shift();
var len = arr.push(7, 9);
console.log(len); //4
检索方法
我们可以利用Array对象提供的方法检索相关内容,除了Array.isArray()方法外,其余方法默认都是从指定数组索引的位置开始检索;
方法名称 | 功能描述 |
---|---|
includes() | 用于确定数组中是否含有某个元素,含有返回true,否则返回false |
Array.isArray() | 用于确定传递的值是否为一个数组,是返回true,不是返回false |
indexOf() | 返回数组中可以找到给定值的第一个索引,不存在则返回-1 |
lastIndexOf() | 返回指定元素在数组中的最后一个索引,不存在则返回-1 |
示例1:includes()与Array.isArray()方法
var data = ['a', 'b', 3, 'c'];
//从下标为2的地方开始检索3
console.log(data.includes(3, 2)); //true
//从数组下标为data.length-3的位置开始检索3
console.log(data.includes(3, -3)); //true
console.log(Array.isArray(data)); //true
示例2:indexOf()方法,用于在数组中从指定下标位置,检索到第一个给定值
var arr = ['a', 'b', 'c', 'd'];
var search = 'd';
if (arr.indexOf(search) === -1) { //查找的元素不存在
arr.push(search); //不存在那就添加上
} eles if (arr.indexOf(search) > -1){ //查找的元素存在,这样写是为了防止下标为0
console.log('元素已在数组中');
}
示例3:lastIndexOf()方法,用于在数组中从指定下标位置,检索到最后一个给定值的下标,它从数组末尾向数组开头检索
var res = [];
var arr = ['a', 'b', 'c', 'a', 'd', 'a'];
var search = 'a';
var i = arr.lastIndexOf(search);
while (i !== -1) {
res.push(i);
i = (i > 0 ? arr.lastIndexOf(search, i - 1) : -1); //三元运算符
}
console.log('元素' + search + '在数组中的所有位置为:' + res);
//元素a在数组中的所有位置为5,3,0
数组转字符串
转换方法如下:
方法名称 | 功能描述 |
---|---|
join() | 将数组中所有元素连接到一个字符串中 |
toString() | 返回一个字符串,表示指定的数组及其元素 |
示例:
var arr = ['a', 'b', 'c'];
var arr1 = [[1, 2], [3, 4]];
console.log(arr.join()); //a, b, c
console.log(arr1.join()); //1, 2, 3, 4
console.log(arr1.toString()); //1, 2, 3, 4
console.log(arr.join('-')); //1, 2-3, 4
其他方法
其他实用方法(示例略):
方法名称 | 功能描述 |
---|---|
sort() | 对数组元素进行排序,并返回数组 |
fill() | 用一个固定的值填充数组中指定下标范围内的全部元素 |
reverse() | 颠倒数组中元素的位置 |
splice() | 对一个数组在指定下标范围内删除或添加元素 |
slice() | 从一个数组的指定下标范围内拷贝数组元素到另一个新数组,并返回这一新数组 |
concat() | 返回一个合并两个或多个数组后的新数组 |