JavaScript 提供了两种强大的数据结构用于存储集合:Set
和 Array
。虽然两者都可以存储多个值,但它们独特的特性使得它们更适合不同的场景。让我们探讨何时以及为何选择其中一个而不是另一个。
Set
最显着的特征是其自动处理重复项。
<code class="language-javascript">// 数组允许重复 const arr = [1, 2, 2, 3, 3, 4]; console.log(arr); // [1, 2, 2, 3, 3, 4] // Set 自动删除重复项 const set = new Set([1, 2, 2, 3, 3, 4]); console.log([...set]); // [1, 2, 3, 4] // 使用 Set 从数组中删除重复项 const uniqueArray = [...new Set(arr)]; console.log(uniqueArray); // [1, 2, 3, 4]</code>
Set
提供了更快的查找时间来检查元素是否存在。
<code class="language-javascript">const largeArray = Array.from({ length: 1000000 }, (_, i) => i); const largeSet = new Set(largeArray); // 数组查找 console.time('Array includes'); console.log(largeArray.includes(999999)); console.timeEnd('Array includes'); // Set 查找 console.time('Set has'); console.log(largeSet.has(999999)); console.timeEnd('Set has'); // Set 明显更快,因为它内部使用哈希表</code>
Array
提供了更多用于数据操作的内置方法,而 Set
专注于唯一性管理。
<code class="language-javascript">// 数组方法 const arr = [1, 2, 3, 4, 5]; arr.push(6); // 添加到末尾 arr.pop(); // 从末尾移除 arr.unshift(0); // 添加到开头 arr.shift(); // 从开头移除 arr.splice(2, 1, 'new'); // 替换元素 arr.slice(1, 3); // 提取部分 arr.map(x => x * 2); // 转换元素 arr.filter(x => x > 2); // 过滤元素 arr.reduce((a, b) => a + b); // 归约为单个值 // Set 方法 const set = new Set([1, 2, 3, 4, 5]); set.add(6); // 添加值 set.delete(6); // 删除值 set.has(5); // 检查是否存在 set.clear(); // 删除所有值</code>
Array
保持插入顺序并提供基于索引的访问,而 Set
只保持插入顺序。
<code class="language-javascript">// 数组索引访问 const arr = ['a', 'b', 'c']; console.log(arr[0]); // 'a' console.log(arr[1]); // 'b' arr[1] = 'x'; // 直接修改 // Set 没有索引访问 const set = new Set(['a', 'b', 'c']); console.log([...set][0]); // 需要先转换为数组 // 不允许直接修改索引</code>
Set
通常比 Array
使用更多内存,但提供更快的查找。
<code class="language-javascript">// 内存比较(粗略示例) const numbers = Array.from({ length: 1000 }, (_, i) => i); // 数组内存 const arr = [...numbers]; console.log(process.memoryUsage().heapUsed); // Set 内存 const set = new Set(numbers); console.log(process.memoryUsage().heapUsed); // 由于哈希表结构,Set 通常使用更多内存</code>
<code class="language-javascript">// 1. 当顺序和索引访问很重要时 const playlist = ['song1.mp3', 'song2.mp3', 'song3.mp3']; const currentTrack = playlist[currentIndex]; // 2. 当您需要数组方法时 const numbers = [1, 2, 3, 4, 5]; const doubled = numbers.map(x => x * 2); const sum = numbers.reduce((a, b) => a + b, 0); // 3. 当重复值可以接受或需要时 const votes = ['yes', 'no', 'yes', 'yes', 'no']; const yesVotes = votes.filter(vote => vote === 'yes').length;</code>
<code class="language-javascript">// 1. 当跟踪唯一值时 const uniqueVisitors = new Set(); function logVisitor(userId) { uniqueVisitors.add(userId); console.log(`Total unique visitors: ${uniqueVisitors.size}`); } // 2. 用于快速查找操作 const allowedUsers = new Set(['user1', 'user2', 'user3']); function checkAccess(userId) { return allowedUsers.has(userId); } // 3. 用于删除重复项 function getUniqueHashtags(posts) { const uniqueTags = new Set(); posts.forEach(post => { post.hashtags.forEach(tag => uniqueTags.add(tag)); }); return [...uniqueTags]; }</code>
您可以根据需要轻松地在 Set
和 Array
之间转换。
<code class="language-javascript">// 数组到 Set const arr = [1, 2, 2, 3, 3, 4]; const set = new Set(arr); // Set 到数组 - 三种方法 const back1 = [...set]; const back2 = Array.from(set); const back3 = Array.from(set.values()); // 用于数组去重 const deduped = [...new Set(arr)];</code>
当您需要以下情况时,选择 Array
:
当您需要以下情况时,选择 Set
:
请记住,您可以随时在两种类型之间进行转换,因此请选择最适合您当前需求的一种。
以上是JavaScript 中的集合与数组:何时使用哪个?的详细内容。更多信息请关注PHP中文网其他相关文章!