首页 > 解决方案 > 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);
    });
  }

标签: javascript

解决方案


您可以用小丑分隔每个字符并测试字符串。

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; }


推荐阅读