【问题标题】:Removing words from array using regex使用正则表达式从数组中删除单词
【发布时间】:2020-05-24 14:16:35
【问题描述】:

我正在创建一个涉及从数组中删除文本的程序。如果一个字母包含在数组中的一个单词中,则该单词将被删除。我的第一个测试成功了,一个带有小数组的简单正则表达式:

var regex = /z/;
var words = ["eggs", "zebras", "lampshade"];

for (i = 0; i < words.length; i++) {
  let testResult = regex.test(words[i]);

  if (!testResult) {
    words.splice(i, 1);
  }
}
console.log(words);

正如预期的那样,它返回了[ 'zebras' ]。因为这很成功,所以我使用一个名为“an-array-of-english-words”的 npm 包迅速扩大规模。我运行了我的新脚本:

const masterWords = require("an-array-of-english-words");
var regex = /z/;
var words = masterWords;

for (i = 0; i < words.length; i++) {
  let testResult = regex.test(words[i]);

  if (!testResult) {
    words.splice(i, 1);
  }
}
console.log(words);

每次我运行它时,它都会返回不遵守正则表达式的值。例如,上面的代码返回 ['aa', 'aahed', 'aahs', ...] 作为它的前几个值。我是否必须更改代码才能处理更大的数组?我是否犯了一个我没有注意到的愚蠢错误?

【问题讨论】:

  • 你可以试试这样用吗? console.log(words.filter(d => /z/.test(d)))
  • 很高兴听到这个消息!

标签: javascript arrays regex


【解决方案1】:

我认为这可能是由于您正在拼接数组并同时循环它。

例如。如果数组长度为 5,当前索引为 2,拼接数组后,索引 3 处的项将移动到索引 2,并在下一次迭代中被跳过,因为下一个索引将是 3。

因此,您可以创建单词的克隆并更改它,同时迭代原始数组。

【讨论】:

  • 是的,你可以通过尝试这个数组来验证这一点:['a', 'a', 'z', 'a', 'a'] 你会看到 ['a', 'z', 'a'] 似乎每个假值都会让下一个值通过,不管是真是假。
【解决方案2】:

@Joey,如果您在官方文档中看到,请尝试以这种方式使用它作为解决方法。 @Igor Moraru 的回答也解释了为什么会发生这个问题。

console.log(words.filter(d => /z/.test(d))) 

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2023-02-21
    • 2020-01-25
    • 2023-03-05
    • 2022-06-24
    • 1970-01-01
    相关资源
    最近更新 更多