如何在TypeScript中按主数组顺序和子数组排名构建目标数组?
在TypeScript中根据主数组和子集数组生成排名数组
问题描述
给定一个代表目标顺序的主数组:
const main_array = ['a', 'b', 'c', 'd', 'e', 'f'];
以及一个仅包含主数组元素的子集数组(元素顺序任意):
const subset_array = ['d', 'a', 'f'];
需要生成一个与主数组长度一致的排名数组:子集元素按自身顺序对应排名(d为1、a为2、f为3),主数组中不在子集里的元素填0。最终期望结果为:
const desired_array = [2, 0, 0, 1, 0, 3];
解决方案
可以通过建立排名映射表 + 遍历主数组匹配的方式实现,步骤如下:
- 构建子集元素的排名映射:利用
Map存储子集元素与其对应的排名(子集数组的索引+1,因为排名从1开始) - 遍历主数组生成结果:对主数组的每个元素,从映射表中获取对应的排名,不存在则返回0
完整TypeScript代码:
const main_array = ['a', 'b', 'c', 'd', 'e', 'f']; const subset_array = ['d', 'a', 'f']; // 建立子集元素到排名的映射 const rankMap = new Map(subset_array.map((item, idx) => [item, idx + 1])); // 生成目标排名数组 const desired_array = main_array.map(item => rankMap.get(item) || 0); console.log(desired_array); // 输出: [2, 0, 0, 1, 0, 3]
代码说明
subset_array.map((item, idx) => [item, idx + 1]):将子集数组转换为[元素, 排名]的键值对数组,索引+1是因为排名从1开始new Map(...):将键值对数组转换为Map结构,实现O(1)时间复杂度的元素查找main_array.map(...):遍历主数组的每个元素,从Map中获取排名,若元素不在子集里则返回0
内容的提问来源于stack exchange,提问作者Kuni
相关产品推荐
相关产品推荐

