TypeScript中的向量数组:多维数组详解
TypeScript向量数组是一种特殊的数据结构,它本质上是由多个向量组成的集合。这里的向量可以是一组数字,也能是自定义的对象。这种多维数组结构在很多场景下都大有用处,像进行数学计算、编写图形程序,或者有条理、安全地处理分组数据时,它都能派上用场。接下来,咱们就深入了解一下如何在TypeScript里创建向量数组,以及对其进行添加、删除、遍历等操作。
一、定义向量类型
在TypeScript中,定义向量类型的方式多种多样,下面给大家详细介绍几种常见的方法:
- 使用元组定义固定长度向量:元组类型适合用来定义长度固定的向量。例如,定义一个三维向量,它始终包含三个数字,就可以这样写:
// 定义一个精确包含3个数字的3D向量类型 type Vector3D = [number, number, number];
- 利用泛型数组定义可变长度向量:要是向量的长度不固定,使用泛型数组类型会更合适。像这样:
// 定义一个可以包含任意数量元素的向量类型 type Vector = number[];
- 借助接口创建自定义向量对象:当向量有更复杂的结构和属性时,通过接口自定义类型就很方便。比如:
// 定义一个包含x、y、z三个属性的向量对象接口 interface VectorObject { x: number; y: number; z: number; }
二、创建向量数组
定义好向量类型后,就可以着手创建向量数组了。下面分别展示创建不同类型向量数组的方法:
- 创建固定长度向量数组:以刚刚定义的三维向量类型
Vector3D
为例,创建一个包含多个三维向量的数组:
// 定义一个Vector3D类型的数组,里面包含多个三维向量 type Vector3D = [number, number, number]; const vectors: Vector3D[] = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
- 创建可变长度向量数组:使用定义好的可变长度向量类型
Vector
,来创建数组:
// 定义一个Vector类型的数组,其中每个向量长度可变 type Vector = number[]; const flexibleVectors: Vector[] = [ [1, 2], [3, 4, 5], [6, 7, 8, 9] ];
- 创建自定义对象向量数组:基于自定义的向量对象接口
VectorObject
,创建包含这种对象的向量数组:
// 定义一个VectorObject类型的数组,数组元素为自定义的向量对象 interface VectorObject { x: number; y: number; z: number; } const objectVectors: VectorObject[] = [ { x: 1, y: 2, z: 3 }, { x: 4, y: 5, z: 6 }, { x: 7, y: 8, z: 9 } ];
三、向量数组的操作
(一)添加向量到数组
在向量数组中添加向量,可以借助数组的一些方法来实现,不同的需求可以选择不同的方法:
- 在数组末尾添加向量:使用
push
方法,能轻松把新向量添加到数组末尾。例如:
// 声明一个向量数组 let vectors: number[][] = [[1, 2, 3], [4, 5, 6]]; // 使用push方法在数组末尾添加一个向量 vectors.push([7, 8, 9]); console.log("After push:", vectors); // 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- 在数组开头添加向量:
unshift
方法专门用于在数组开头插入向量,操作如下:
// 使用unshift方法在数组开头添加一个向量 vectors.unshift([0, 0, 0]); console.log("After unshift:", vectors); // 输出: [[0, 0, 0], [1, 2, 3], [4, 5, 6], [7, 8, 9]]
- 在指定位置插入向量:要是想在数组的特定位置插入向量,
splice
方法就派上用场了。比如在索引为2的位置插入向量:
// 使用splice方法在索引2的位置插入一个向量 vectors.splice(2, 0, [10, 11, 12]); console.log("After splice:", vectors); // 输出: [[0, 0, 0], [1, 2, 3], [10, 11, 12], [4, 5, 6], [7, 8, 9]]
- 合并数组并创建新数组:
concat
方法不会修改原数组,而是返回一个合并后的新数组。示例如下:
// 使用concat方法将一个新向量与原数组合并,生成新数组 const newVectors = vectors.concat([[13, 14, 15]]); console.log("After concat (new array):", newVectors); // 输出: [[0, 0, 0],..., [13, 14, 15]] console.log("Original array remains unchanged:", vectors);
(二)从数组中删除向量
从向量数组中删除向量,也有多种方法可供选择:
- 删除数组末尾的向量:
pop
方法会删除数组中最后一个向量,并返回被删除的向量。代码示例:
// 定义一个向量数组 let vectorArray: number[][] = [[0, 0, 0], [1, 2, 3], [4, 5, 6], [7, 8, 9]]; // 使用pop方法删除数组末尾的向量 let removedLast = vectorArray.pop(); console.log("After pop:", vectorArray);
- 删除数组开头的向量:
shift
方法用于删除数组的第一个向量,同样会返回被删除的向量:
// 使用shift方法删除数组开头的向量 let removedFirst = vectorArray.shift(); console.log("After shift:", vectorArray);
- 删除指定索引的向量:
splice
方法不仅能插入向量,还能删除指定索引的向量。例如删除索引为1的向量:
// 使用splice方法删除索引为1的向量 let removedAtIndex = vectorArray.splice(1, 1); console.log("After splice:", vectorArray);
- 根据条件过滤向量:
filter
方法可以根据设定的条件,创建一个不包含某些向量的新数组。比如,过滤掉元素之和大于10的向量:
// 使用filter方法过滤掉元素之和大于10的向量 let filteredArray = vectorArray.filter(vector => vector.reduce((sum, num) => sum + num, 0) <= 10); console.log("After filter (sum <= 10):", filteredArray);
- 截取数组部分向量:
slice
方法通过指定索引范围,创建一个不包含某些向量的新数组。例如,创建一个不包含前两个向量的新数组:
// 使用slice方法创建一个不包含前两个向量的新数组 let slicedArray = vectorArray.slice(1); console.log("After slice (new array):", slicedArray);
(三)遍历向量数组
遍历向量数组在编程中很常见,TypeScript提供了多种遍历方式:
- 使用
forEach
方法遍历:forEach
会为数组中的每个向量执行一次传入的函数。示例如下:
// 定义一个向量数组 let vectorArray: number[][] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; // 使用forEach方法遍历数组,打印每个向量 vectorArray.forEach((vector) => console.log("forEach:", vector));
- 使用
map
方法遍历并转换:map
方法会创建一个新数组,新数组的元素是对原数组每个向量调用指定函数后的返回值。比如,将每个向量中的元素都乘以2:
// 使用map方法将每个向量中的元素都乘以2,生成新数组 let doubledVectors = vectorArray.map((vector) => vector.map((num) => num * 2)); console.log("map:", doubledVectors);
- 使用
filter
方法遍历并筛选:filter
方法用于创建一个新数组,新数组只包含满足特定条件的向量。例如,筛选出第一个元素大于3的向量:
// 使用filter方法筛选出第一个元素大于3的向量,生成新数组 let filteredVectors = vectorArray.filter((vector) => vector[0] > 3); console.log("filter:", filteredVectors);
- 使用
reduce
方法遍历并累加:reduce
方法通过迭代数组,应用传入的函数来累加值。比如,计算数组中所有元素的总和:
// 使用reduce方法计算数组中所有元素的总和 let sumOfAllElements = vectorArray.reduce( (acc, vector) => acc + vector.reduce((sum, num) => sum + num, 0), 0 ); console.log("reduce:", sumOfAllElements);
- 使用
for...of
循环遍历:for...of
循环可以直接遍历数组中的每个向量,代码如下:
// 使用for...of循环遍历数组,打印每个向量 for (let vector of vectorArray) { console.log("for...of:", vector); }
- 使用传统
for
循环遍历:传统的for
循环通过索引来遍历数组,也能实现对向量数组的遍历:
// 使用传统for循环遍历数组,打印每个向量 for (let i = 0; i < vectorArray.length; i++) { console.log("for loop:", vectorArray[i]); }
四、向量数组应用示例
下面通过一个实际例子,展示向量数组的应用。假设有一个包含多个三维向量的数组,我们要计算每个向量的模长。向量的模长计算公式为:对于向量<a1, a2, a3>
,其模长$|a| = sqrt{a1^2 + a2^2 + a3^2}$。在TypeScript中实现代码如下:
// 定义三维向量类型 type Vector3D = [number, number, number]; // 定义包含多个三维向量的数组 const vectors: Vector3D[] = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; // 使用map方法计算每个向量的模长,生成模长数组 const magnitudes = vectors.map(([x, y, z]) => { return Math.sqrt(x ** 2 + y ** 2 + z ** 2); }); console.log(magnitudes); // 输出: [3.741, 8.774, 13.928]
以上就是TypeScript中向量数组的全部内容啦。希望大家在学习和实践中能熟练运用这些知识,享受编程的乐趣!