基于overusedWords数组过滤storyWords数组的替代实现方案求助
过滤数组元素的几种实用实现方法
嘿,我懂你搜了半天没找到精准方案的郁闷,这就给你几个靠谱的实现方式,既能替代现有代码的效果,也能解决你之前循环失败的问题!
1. 用Array.filter()实现(最简洁的原生方法)
这是JavaScript里专门为数组过滤设计的方法,一行代码就能搞定,可读性还强。核心逻辑就是遍历storyWords的每个元素,只保留不在overusedWords里的单词。
// 先定义你的基础数据 const overusedWords = ['literally', 'most', 'beautiful']; const story = 'Last weekend, I took literally the most beautiful bike ride of my life. The route is called "The 9W ...'; const storyWords = story.split(/\W+/); // 将字符串分割为单词数组 // 生成过滤后的新数组 const filteredWords = storyWords.filter(word => !overusedWords.includes(word)); console.log(filteredWords); // 输出不含过度使用单词的数组
解释:filter()会遍历数组的每一项,回调函数返回true的元素会被保留到新数组里。这里用!overusedWords.includes(word)判断当前单词不在禁用列表中,符合条件就留下。
2. 手动循环实现(解决你之前循环失败的问题)
如果你更倾向于用循环来写,大概率是之前的循环逻辑有小疏漏(比如没初始化空数组、判断条件写反)。下面是两种正确的循环写法:
传统for循环
const overusedWords = ['literally', 'most', 'beautiful']; const story = 'Last weekend, I took literally the most beautiful bike ride of my life. The route is called "The 9W ...'; const storyWords = story.split(/\W+/); const filteredWords = []; // 一定要先初始化空数组 for (let i = 0; i < storyWords.length; i++) { const currentWord = storyWords[i]; // 关键:判断单词不在过度使用列表里才添加 if (!overusedWords.includes(currentWord)) { filteredWords.push(currentWord); } } console.log(filteredWords);
更简洁的for...of循环
const filteredWords = []; for (const word of storyWords) { if (!overusedWords.includes(word)) { filteredWords.push(word); } }
注意:之前循环失败很可能是没加!(取反),导致把要过滤的单词留了下来,或者忘记初始化用来存放结果的空数组,现在这个写法就能完美避免这些问题。
3. 大数组优化方案:用Set提升查找效率
如果你的overusedWords里有大量元素,用includes()每次查找都是O(n)的时间复杂度,效率偏低。这时候可以把overusedWords转成Set,查找时间会降到O(1),性能更好:
const overusedSet = new Set(overusedWords); // 转成Set const filteredWords = storyWords.filter(word => !overusedSet.has(word));
或者用循环配合Set:
const overusedSet = new Set(overusedWords); const filteredWords = []; for (const word of storyWords) { if (!overusedSet.has(word)) { filteredWords.push(word); } }
内容的提问来源于stack exchange,提问作者Gabriel Velloso
相关产品推荐
相关产品推荐

