javascript - Javascript 字符串匹配名字或姓氏,包括部分
问题描述
假设我有一个用户列表,firstName
并且lastName
想要过滤那些匹配名字或姓氏,或两者,或任何部分的用户,无论空格如何。我将如何构建该过滤器?
我能得到的最接近的是
const userString = (user.firstName + user.lastName + user.email).toLowerCase().replace(/\s/g,'');
return userString.includes(filterValue); // where filter value is the thing to test
因此,如果我们正在使用users = [John Smith, Adam Applebaum, Steve Wright]
,并且我输入“jo”或“sm”,我会正确地得到“John Smith”,但如果我输入“josm”,我也会想要“John Smith”,但我似乎无法得到即返回。
如何构建过滤器或测试以同时包含名字和姓氏,或其中的任何组合。
@Nina 在下面的回答很完美,但是我必须针对我的特定用例进行一些修改,我的最终实现是;
private _filter(value: string): User[] {
if (!value || typeof value !== 'string') { return this.users; }
const regexp = new RegExp([...(value.split(" "))].join('.*'), 'i');
return this.users.filter(user => {
const userString = user.firstName + ' ' + user.lastName;
return regexp.test(userString);
});
}
解决方案
您可以用小丑分隔每个字符并测试字符串。
function filter(array, string) {
return array.filter(RegExp.prototype.test, new RegExp([...string].join('.*'), 'i'));
}
var array = ['John Smith', 'Adam Applebaum', 'Steve Wright'];
console.log(filter(array, "jo"));
console.log(filter(array, "sm"));
console.log(filter(array, "josm"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- php - laravel 8,找不到类“App\Http\Controllers\Admin\Category”{“异常”:{}}
- swift - UITextFields 键盘未出现在 UIScrollview 中
- c# - ILogger<> 约定在 Azure Function 托管的服务中不起作用
- javascript - jQuery Burger 菜单不起作用且不可点击
- javascript - 下拉列表移动其他元素
- python - 如何将 .gif 粘贴到 .png 图像上并将生成的文件另存为 .gif?
- css - iPhone 不支持 CSS 网格行
- api - 一段时间后如何删除发布到松弛的消息?
- python - 在 python 中编写正则表达式来匹配两个特定的单词,允许设置单词之间的数量
- c++ - 用于嵌入式系统的 C++ 事件驱动状态机