【问题标题】:error in match() function of javascriptjavascript 的 match() 函数中的错误
【发布时间】:2017-10-26 00:50:32
【问题描述】:

我一直在对员工姓名进行过滤,我使用 match() 来比较姓名数组和用户的输入。

这是我的匹配代码

filteredEmp = [];

filterEmployee(name){

 let len = this.employeesList.length;

 for (var i = 0; i < len; ++i) {
    if (this.employeesList[i].name.match(name)) {
        this.filteredEmp.push(this.employeesList[i]);
    }
 }
}

但是当我输入这样的名字时

name = 'Min';

输出不一样

this.filteredEmp =[ 

         0:{id:1,name:"Casper, Mika"},
         1:{id:1,name:"Casper, Mika"},
         2:{id:3,name:"Ming, Edmund"}

]

预期的输出应该是这样的

this.filteredEmp =[ 

     0:{id:3,name:"Ming, Edmund"}

]

我使用的是 angular 2,所以如果您有可以帮助我过滤过滤器的建议,请这样做。

【问题讨论】:

  • employeesList 长什么样子?
  • match 与正则表达式一起用作第一个参数。你提供了一个字符串。尝试使用Array.prototype.indexOfArray.prototype.find
  • 与 this.filteredEmp 相同,但只包含过滤后的员工
  • 我认为您正在寻找includesmatch 用于正则表达式。
  • 你真的应该展示实际的代码.....我觉得如果我们看到真实的代码,而不是显示的无效代码,会有一个简单的解释。

标签: javascript arrays angular match


【解决方案1】:

您使用了错误的功能。 String.prototype.match 在第一个参数中需要一个正则表达式。

你需要String.prototype.indexOf:

filteredEmp = [];

filterEmployee(name){

 let len = this.employeesList.length;

 for (var i = 0; i < len; ++i) {
    if (this.employeesList[i].name.indexOf(name) > -1) {
        this.filteredEmp.push(this.employeesList[i]);
    }
 }
}

或者更好地使用数组函数而不是自己迭代它:

filteredEmp = [];

var filterEmployee =(name)=>{
    this.filteredEmp = this.employeesList.filter((empName)=>empName.name.indexOf(name)>-1);
}

【讨论】:

  • 小写的那我该怎么办
  • 我过滤(分钟),但结果给出一个空数组
  • @MariaJen 首先:您的代码也可以:fiddle 第二:只需使用String.prototype.toLowercase 函数。
【解决方案2】:

我认为当你输入“M”时, 那么

this.filteredEmp =[ 

      {id:1,name:"Casper, Mika"},
      {id:1,name:"Casper, Mika"},
      {id:3,name:"Ming, Edmund"}
];

然后你因为其他原因出错了。

【讨论】:

    【解决方案3】:

    您的代码似乎只正确返回了一个预期结果:

    // Added
    let employeesList = [
    {
      'name': 'Casper, Mika'
    },
    {
      'name': 'Ming, Edmund'
    },
    {
      'name': 'Someone, Else'
    }
    ];
    
    filteredEmp = [];
    
    function filterEmployee(name) {
      let len = employeesList.length;
      for (var i = 0; i < len; i++) {
        if (employeesList[i].name.match(name)) {
          filteredEmp.push(employeesList[i]);
        }
      }
      console.log(filteredEmp);
    }
    
    //filterEmployee('Mi'); // Matches 'Mika' + 'Ming'
    filterEmployee('Min'); // Only matches 'Ming'

    我只能假设您不小心输入了filterEmployee('Mi') 而不是filterEmployee('Min'),这也与Mika 匹配。

    要进行不区分大小写的搜索,只需将.match() 中的name 替换为new RegExp(name, 'i')),并添加不区分大小写的修饰符。

    if (employeesList[i].name.match(new RegExp(name, 'i'))) { }
    

    这可以在下面看到:

    // Added
    let employeesList = [
    {
      'name': 'Casper, Mika'
    },
    {
      'name': 'Ming, Edmund'
    },
    {
      'name': 'Someone, Else'
    }
    ];
    
    filteredEmp = [];
    
    function filterEmployee(name) {
      let len = employeesList.length;
      for (var i = 0; i < len; i++) {
        if (employeesList[i].name.match(new RegExp(name, 'i'))) {
          filteredEmp.push(employeesList[i]);
        }
      }
      console.log(filteredEmp);
    }
    
    filterEmployee('min');

    希望这会有所帮助! :)

    【讨论】:

    • 小写的那我该怎么办
    • ^ 我不确定你在问什么。您只需根据您为name 输入的内容进行过滤。
    • 我过滤(分钟),但结果给出一个空数组
    • 要进行不区分大小写的搜索,只需将.match 中的name 替换为new RegExp(name, 'i')),即可添加不区分大小写的修饰符。我已经更新了我的答案以展示这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多