使用 JavaScript 删除元素出现次数超过 n 次的情况
在 JavaScript 编程领域,有效地管理数组中元素的出现次数至关重要。具体来说,如果元素的出现次数超过某个阈值(由变量“n”表示),则能够删除该元素的实例,这可以极大地提高数据操作任务的效率和准确性。通过利用 JavaScript 的强大功能,开发人员可以采用一种强大的方法来选择性地从数组中删除冗余的元素出现。在本文中,我们将深入探讨使用 JavaScript 删除元素出现次数超过“n”次的情况的分步过程,阐明底层算法的复杂性,并使程序员能够优化其代码以提高生产力。
问题陈述
给定一个整数数组和一个正整数 n,编写一个 JavaScript 函数,如果数组中任何元素的出现次数超过 n 次,则删除该元素的所有出现。该函数应就地修改输入数组并返回修改后的数组。
示例输入 -
const arr = [1, 2, 3, 1, 2, 1, 1, 3]; const n = 2;
示例输出 -
[1, 2, 3, 1, 2, 3]
方法
在本文中,我们将了解在 JavaScript 中解决上述问题陈述的几种不同方法 -
使用哈希映射
使用数组跟踪出现次数
使用频率映射
Learn JavaScript in-depth with real-world projects through our JavaScript certification course. Enroll and become a certified expert to boost your career.
方法 1:使用哈希映射
要创建哈希映射,请从一个空对象开始。然后遍历输入数组。在每次迭代中,确定元素是否作为哈希映射中的键存在。如果不存在,则将其添加为新键并将其值设置为 1。或者,如果元素已经存在,则递增其对应值。之后,再次遍历输入数组,根据哈希映射过滤掉计数超过给定阈值(由“n”表示)的元素。最终,返回生成的过滤数组。
示例
函数 deleteOccurrences 以数组 arr 和数字 n 作为输入。它初始化一个空对象 countMap 作为哈希映射。forEach 方法遍历 arr,检查每个元素 num 是否作为 countMap 中的键存在。如果不存在,则添加 num 作为键并将值设置为 1。如果存在,则将其值加 1。在创建哈希映射后,filter 方法用于 arr 以创建一个新数组,其中包含计数(根据 countMap)小于或等于 n 的元素。最后,将过滤后的数组作为结果返回。
function deleteOccurrences(arr, n) { const countMap = {}; arr.forEach((num) => { countMap[num] = (countMap[num] || 0) + 1; }); return arr.filter((num) => countMap[num]-- <= n); } const arr = [1, 2, 4, 2, 2, 1, 3, 2, 1]; const n = 2; console.log(deleteOccurrences(arr, n));
输出
以下是控制台输出 -
[ 4, 2, 1, 3, 2, 1 ]
方法 2:使用数组跟踪出现次数
为了压缩代码,我们首先初始化一个空数组来存储元素出现次数。然后,我们遍历输入数组,检查结果数组中每个元素的出现次数。如果计数小于或等于 n,我们将元素添加到结果数组中。最后,我们返回结果数组。
示例
函数 deleteOccurrences 以数组 arr 和数字 n 作为输入。它创建一个名为 result 的空数组,用于存储出现次数小于或等于 n 次的元素。使用 forEach 方法,它遍历 arr 并使用 filter 方法检查 result 中的出现次数。如果计数小于 n,则将元素添加到 result 中。最后,它返回 result 作为输出。
function deleteOccurrences(arr, n) { const result = []; arr.forEach((num) => { if (result.filter((el) => el === num).length < n) { result.push(num); } }); return result; } const arr = [1, 2, 4, 2, 2, 1, 3, 2, 1]; const n = 2; console.log(deleteOccurrences(arr, n));
输出
以下是控制台输出 -
[ 1, 2, 4, 2, 1, 3 ]
方法 3:使用频率映射
首先,初始化一个空映射以跟踪元素频率。然后,继续遍历输入数组,递增映射中每个元素的频率。之后,通过再次遍历输入数组创建一个新数组,只选择频率小于或等于给定值 n 的元素。最后,返回生成的新的数组,其中只包含满足频率条件的元素。
示例
函数 deleteOccurrences 以数组 arr 和数字 n 作为输入。它初始化一个名为 frequencyMap 的空 Map 以存储元素的频率。它使用 forEach 方法遍历 arr 并检查每个元素 num 是否为 frequencyMap 中的键。如果不存在,则将其值设置为 1;否则,将其值加 1。在创建频率映射后,它使用 filter 方法过滤输入数组 arr,创建一个新数组,其中仅包含根据 frequencyMap 频率小于或等于 n 的元素。最后,将过滤后的数组作为结果返回。
function deleteOccurrences(arr, n) { const result = []; arr.forEach((num) => { if (result.filter((el) => el === num).length < n) { result.push(num); } }); return result; } const arr = [1, 2, 4, 2, 2, 1, 3, 2, 1]; const n = 2; console.log(deleteOccurrences(arr, n));
输出
以下是控制台输出 -
[ 1, 2, 4, 2, 1, 3 ]
结论
总之,可以在 JavaScript 中有效地完成删除超过某个阈值的元素实例的过程。通过利用条件语句和数组操作的强大功能,可以有效地遍历和修改数组以删除特定元素的过多出现。尽管这项任务起初看起来可能很艰巨,但明智地应用这些技术使开发人员能够减少冗余并简化数据结构。在 JavaScript 编程中采用此类策略可以大大优化性能并促进代码优雅,从而营造更流畅、更便捷的用户体验。