JavaScript——数组进阶

本文详细介绍了JavaScript中的二维数组创建、遍历和转置方法,包括使用Array对象创建、直接使用方括号创建以及通过多维空数组添加元素。此外,还讲解了冒泡排序和插入排序的原理和示例,以及数组的常见方法,如栈和队列操作、检索方法、数组转字符串和其他实用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见二维数组操作

创建

使用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()返回一个合并两个或多个数组后的新数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值