从数组中过滤出多个文本值
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'))
我需要过滤一个数组,这样当某些值包含选定的单词或短语时,它们就不会被输出。例如,如果我的数组类似于 ["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'))