TS,JS数组去重(事件复杂度为O(1))

本文介绍了如何在TypeScript和JavaScript中使用哈希算法实现数组去重,并关注时间复杂度为O(1)的优化。作者在原有的基础上进行了改进,同时分享了测试结果,探讨了大量数据处理的时间效率,期待读者的反馈和建议。

TS,JS数组去重(事件复杂度为O(1))

今天去看了时间复杂度,觉得在代码运行优化中,还是占据着很大一部分程度了。参考文章这篇文章里看了数组去重,没有检查数据类型所以我在此之上对此做出了一点修改,本篇使用了hash算法。以下内容大部分参考了大神文章

我也有想过做一个功能强大的数组深度去重方法,原谅我能力有限,绞尽脑汁没有想出来

欢迎大神指教
创建空对象会有__proto__,这时候用Object.create(null)就不会有了

interface ITemp {
  [keyName: string] :{
    [elementName: string]: number |undefined
  } | any
}
function arrayUnique(arr: any[]) {
  let result: Array<any> = [arr[0]] ;
  let temp:ITemp = Object.create(null) ;
  temp[arr[0]] = {}
  temp[arr[0]][(typeof arr[0])] = arr[0]
  for(let i =1 ; i < arr.length ; i++) {
    if( temp[arr[i]] === undefined ) {
      temp[arr[i]] = {}
    }
    if( temp[arr[i]][(typeof arr[i])] === undefined && temp[arr[i]] !== arr[i]) {
      temp[arr[i]][(typeof arr[i])] = arr[i]
      result.push(arr[i])
    }
  }
  return result;
}

JS

function arrayUnique(arr) {
    var result = [arr[0]];
    var temp = {};
    temp[arr[0]] = Object.create(null);
    temp[arr[0]][(typeof arr[0])] = arr[0];
    for (var i = 1; i < arr.length; i++) {
        if (temp[arr[i]] === undefined) {
            temp[arr[i]] = {};
        }
        if (temp[arr[i]][(typeof arr[i])] === undefined && temp[arr[i]] !== arr[i]) {
            temp[arr[i]][(typeof arr[i])] = arr[i];
            result.push(arr[i]);
        }
    }
    return result;
}

同时我用去测了函数执行时间

// 定义一个测试函数,将待测函数作为参数传入
const test = (func:any ,n:any):any => {
  let start = new Date().getTime();//起始时间
  let res = func(n);//执行待测函数
  // console.log('当n='+n+'的时候 '+res);
  let end = new Date().getTime();//结束时间
  return (end - start)+"ms";//返回函数执行需要时间
}
const arr = [1,2,3,456,7,8,null,1,2,3,4,undefined,6,7,8,9,"1"]
let time = test(arrayUnique,arr);
console.log(time);

打印结果
在这里插入图片描述

测试大量数据数据时间

const arr = new Array(100000)
let time = test(arrayUnique,arr);
console.log(time);

在这里插入图片描述
欢迎大家评论,给我点建议,大家一起成长!!!!

<think>首先,用户的问题是:“我想使用TypeScript合并两个列表 请问TypeScript 合并两个数组列表”。这是一个关于TypeScript中合并数组的问题。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但这里没有数学表达式,所以不需要。 - 独立公式必须使用$$...$$格式,但同样,没有公式。 - LaTeX语法正确:不适用,因为没有数学。 - 使用中文回答:必须用中文。 - 生成相关问题:在回答结束后,需要生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:参考引用[1]到[4],但用户说“上述引用仅供参考,并不是用户真正的需求”,所以我应该专注于用户的问题,而不是这些引用。用户的问题是合并两个数组列表,所以我需要基于TypeScript知识回答。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 用户的问题:合并两个数组列表在TypeScript中。在TypeScript中,数组是列表的一种形式,所以合并两个数组很简单。 关键点: - TypeScript是JavaScript的超集,所以数组操作与JavaScript相同。 - 合并数组可以使用多种方法,如扩展运算符(...)、Array.concat()方法等。 步骤: 1. **理解问题**:用户想合并两个数组列表。 2. **提供方法**: - 使用扩展运算符:例如,`const merged = [...array1, ...array2];` - 使用Array.concat()方法:例如,`const merged = array1.concat(array2);` 3. **示例代码**:给出TypeScript代码示例。 4. **解释**:简要解释每种方法。 5. **注意事项**:如果有复元素或类型问题,可以提到。 引用:用户提供了引用[1]到[4],但说它们是参考,不是真正需求。引用[2]和[3]涉及数组和排序,但用户只问合并,所以可能不需要。我应该专注于合并部分。 在回答中,如果需要引用,添加引用标识,但这里可能不需要直接引用,除非我参考那些内容。 结构回答: - 开头:确认问题。 - 主体:解释合并方法,提供示例。 - 结尾:生成相关问题。 生成相关问题: - 根据用户问题,相关问题可以包括、排序、性能等。 最终回答: - 用中文。 - 清晰结构。</think>### TypeScript 合并两个数组列表 在 TypeScript 中,合并两个数组列表是一个常见的操作,类似于 JavaScript。TypeScript 作为 JavaScript 的超集,支持所有 JavaScript 的数组方法。合并数组时,主要使用扩展运算符(`...`)或 `Array.concat()` 方法,这两种方式简单高效。下面我将一步步解释如何实现,并提供示例代码。 #### 1. **基本合并方法** - **使用扩展运算符 (`...`)**:这是最简洁的方式,将两个数组的元素展开后合并到一个新数组中。 - 语法:`const merged = [...array1, ...array2];` - 优点:代码简洁,易于阅读;适用于现代 TypeScript/JavaScript 环境。 - 注意:这会创建一个新数组,不会修改原数组。 - **使用 `Array.concat()` 方法**:这是传统方法,将两个或多个数组连接起来。 - 语法:`const merged = array1.concat(array2);` - 优点:兼容性更好,支持旧版浏览器或环境。 - 注意:同样返回一个新数组,不影响原数组。 示例代码: ```typescript // 定义两个数组 const list1: number[] = [1, 2, 3]; const list2: number[] = [4, 5, 6]; // 方法1: 使用扩展运算符 const mergedWithSpread = [...list1, ...list2]; console.log(mergedWithSpread); // 输出: [1, 2, 3, 4, 5, 6] // 方法2: 使用 concat() const mergedWithConcat = list1.concat(list2); console.log(mergedWithConcat); // 输出: [1, 2, 3, 4, 5, 6] ``` #### 2. **处理复杂数据类型** 如果数组包含对象或其他复杂类型,合并方法同样适用。但需要注意: - **引用类型问题**:合并后,新数组中的对象是原数组的浅拷贝(即共享引用)。如果修改对象属性,会影响所有引用。 - **类型安全**:TypeScript 的类型检查会确保数组元素类型一致。例如,如果 `list1` 和 `list2` 都是 `Array<{ id: number }>`,合并后类型自动推断。 示例代码(对象数组): ```typescript interface User { id: number; name: string; } const users1: User[] = [{ id: 1, name: "Alice" }]; const users2: User[] = [{ id: 2, name: "Bob" }]; // 合并对象数组 const mergedUsers = [...users1, ...users2]; console.log(mergedUsers); // 输出: [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }] ``` #### 3. **常见问题与注意事项** - **性能**:对于大型数组(如数万元素),扩展运算符和 `concat()` 性能相似,时间复杂度为 $O(n)$,其中 $n$ 是总元素数。在循环中频繁合并时,建议使用 `concat()` 以避免潜在的性能开销。 - **复元素**:基本合并不会自动。如果需,可以使用 `Set` 或额外处理(见下文“高级技巧”)。 - **空数组处理**:如果数组为空,合并操作会安全返回另一个数组的副本。 - **类型错误**:如果数组类型不兼容(如 `number[]` 和 `string[]`),TypeScript 编译时会报错,确保类型安全。 #### 4. **高级技巧:结合和排序** 如果合并后需要或排序,可以参考引用中的方法(如使用 `Map` 或 `Set` ,`sort()` 排序)。但这不是合并的核心部分,仅在需要时添加。例如: - **合并**:使用 `Set` 或 `Map` 确保唯一性。 ```typescript const list1 = [1, 2, 2]; const list2 = [2, 3, 4]; const merged = [...list1, ...list2]; const unique = Array.from(new Set(merged)); // console.log(unique); // 输出: [1, 2, 3, 4] ``` - **合并后排序**:使用 `sort()` 方法。 ```typescript const merged = [...list1, ...list2]; const sorted = merged.sort((a, b) => a - b); // 升序排序 ``` 引用中提到数组和排序的优化方法(如使用 `Map` 提高效率),这些在合并大型数组时很有用[^2][^3]。 #### 总结 在 TypeScript 中合并两个数组列表,推荐使用扩展运算符 `[...array1, ...array2]` 或 `array1.concat(array2)`。这两种方法简单、高效,且类型安全。如果涉及或排序,可以额外添加步骤。根据您的需求,选择合适的方法即可。如果您提供更多细节(如数组类型或大小),我可以给出更针对性的建议。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值