从数组中过滤出多个文本值

Filter out multiple text values from an array

我需要过滤一个数组,这样当某些值包含选定的单词或短语时,它们就不会被输出。例如,如果我的数组类似于 ["John Smith", "Bob Smith", "John Doe", "Dave Jones"],我可能想排除包含 Bob 或 Dave 的值。

目前,要做到这一点,我有以下内容:

const filtered =
    names.filter(
        myArray.toLowerCase().indexOf('bob') === -1 
        && myArray.toLowerCase().indexOf('dave') === -1 
    ); 
let content = '';
filtered.forEach(item => {...}

这很好而且有效,但是如果我要增加要过滤掉的单词的数量,这将变得非常冗长。

我想我可以通过使用数组过滤来解决这个问题

myArray.toLowerCase().indexOf(['bob', 'dave']) === -1

这个,事实证明 returns 什么都没有。于是继续尝试

['bob', 'dave'].some(x => myArray.toLowerCase().indexOf(x) === -1)

但这也失败了。我有一个想法,这些可能失败的原因是逻辑以某种方式寻找这两个值,但我既无法证明这一点,也无法解决它。

使用 Regex 查找复杂的字符串最简单,Regex 也有一个内置的“忽略大小写”标志,可以从字符串数组中组装。

const names = ["John Smith", "Bob Smith", "John Doe", "Dave Jones"];
const exclude = ["bob", "dave"];
const excludeRegex = new RegExp(exclude.join("|"), "i"); // finds strings matching "bob" or "dave" ignoring case
const filtered = names.filter(n => !excludeRegex.test(n)); // Regexp.test(str) returns true if the search finds any matches in str
console.log(filtered)

你可以用for循环检查所有的单词。它的函数可能如下所示:

function filter(names, blacklist) {
    return names.filter(name => {
        for (const word of blacklist) {
            if (name.toLowerCase().includes(word.toLowerCase())) return false;
        }
        return true;
    });
}

添加到@LaytonGB 的答案中,您可以使用剩余参数使其成为一个函数

function filterNames(arr, ...arg) {
  let regex = new RegExp(arg.join("|"), "i");
  return arr.filter(n => !regex.test(n));
}

let arr = ["John Smith", "bOb Smith", "John Doe", "Dave Jones", "Mike Caw", "Arron Crybaby", "King George", "PaPa Murphy" ]
console.log(filterNames(arr, 'smith', 'Doe', 'mike', 'king'))