Set与Array的区别及转换

在 JavaScript 中,SetArray 都是用于存储数据的集合类型,但它们在设计目的、特性和使用场景上有显著差异。以下是它们的核心区别、适用场景及互相转换方法:


一、核心区别

特性 Set Array
元素唯一性 自动去重,值唯一 允许重复值
元素顺序 按插入顺序存储 按索引顺序存储
查找性能 has() 方法高效(O(1)) includes() 方法较慢(O(n))
操作方法 add(), delete(), clear push(), pop(), splice
索引访问 不支持索引访问(如 set[0] 支持索引访问(如 arr[0]
迭代方式 支持 for...offorEach 支持 forfor...of 及高阶函数(如 mapfilter

二、使用场景

优先使用 Set 的情况:

  1. 需要自动去重
    例如:收集用户标签、过滤重复日志、统计唯一访问者。

    const uniqueTags = new Set(['js', 'css', 'js']); // Set(2) { 'js', 'css' }
    
  2. 需要快速判断元素是否存在
    例如:检查权限列表、缓存验证。

    const permissions = new Set(['read', 'write']);
    if (permissions.has('read')) { /* ... */ }
    
  3. 需要高效增删元素
    Setadddelete 操作时间复杂度为 O(1),适合频繁增删场景。


优先使用 Array 的情况:

  1. 需要保留重复元素
    例如:记录用户操作日志、保存订单列表。

  2. 需要索引访问或顺序操作
    例如:分页数据、排序、截取子数组。

    const sortedArr = [3, 1, 2].sort(); // [1, 2, 3]
    
  3. 需要高阶函数处理数据
    例如:使用 mapfilterreduce 转换数据。

    const doubled = [1, 2, 3].map(x => x * 2); // [2, 4, 6]
    

三、互相转换

1. Array → Set

直接通过 Set 构造函数转换,自动去重

const arr = [1, 2, 2, 3];
const set = new Set(arr); // Set(3) { 1, 2, 3 }

2. Set → Array

使用 Array.from() 或扩展运算符(...)转换:

const set = new Set([1, 2, 3]);

// 方法1:Array.from()
const arr1 = Array.from(set); // [1, 2, 3]

// 方法2:扩展运算符
const arr2 = [...set]; // [1, 2, 3]

四、结合使用示例

数组去重

const arr = [1, 2, 2, 3];
const uniqueArr = [...new Set(arr)]; // [1, 2, 3]

交集/并集/差集

const setA = new Set([1, 2, 3]);
const setB = new Set([2, 3, 4]);

// 并集
const union = new Set([...setA, ...setB]); // {1, 2, 3, 4}

// 交集
const intersection = new Set([...setA].filter(x => setB.has(x))); // {2, 3}

// 差集(A - B)
const difference = new Set([...setA].filter(x => !setB.has(x))); // {1}

五、总结

  • 选择 Set:需去重、快速查找、高效增删元素的场景。
  • 选择 Array:需保留重复、索引访问、高阶函数操作的场景。
  • 转换技巧
    • new Set(arr) 实现数组去重。
    • Array.from(set)[...set] 将 Set 转为数组。
posted @ 2025-04-30 17:33  张浩伟  阅读(145)  评论(0)    收藏  举报