【问题标题】:JS: Filter object array for partial matchesJS:过滤部分匹配的对象数组
【发布时间】:2017-06-21 12:02:45
【问题描述】:

是否可以过滤那些匹配搜索字符串的对象?

const arr = [
    { title: 'Just an example' },
    { title: 'Another exam'},
    { title: 'Something different'}
]

我试过了

arr.filter(x => { return x.title === searchStr });

但这只会过滤完全匹配,但我需要找到所有部分匹配。 let searchStr = 'exam' 应该给我两个对象(第一个和第二个),let searchStr = 'examp' 应该只给我一个对象作为结果。

【问题讨论】:

  • x.title.indexOf(searchStr) !== -1?

标签: javascript ecmascript-6


【解决方案1】:

根据您的问题,我假设您还希望匹配字符串的大写和小写版本,因此 RegExps 是正确的(但不是唯一的)选择。

正则表达式解决方案:

首先,在循环外用i flag 定义一个不区分大小写的RegExp(这样可以避免在每次迭代时重新创建一个新的RegExp 实例):

 const regexp = new RegExp(searchStr, 'i');

然后您可以使用RegExp#test 过滤列表(String#match 也可以):

arr.filter(x => regexp.test(x.title))

String#includes 解决方案:

您还可以使用String.includes 方法,在比较它们之前将两个字符串转换为小写:

arr.filter(x => x.title.toLowerCase().includes(searchStr.toLowerCase()))

【讨论】:

  • 有一个右括号太多了:arr.filter(x => regexp.test(x))),对于这个问题,您必须使用x.title 而不是x... ;-)
  • 很棒的解决方案。谢谢!
【解决方案2】:

由于您使用的是 ES6,因此请使用 includes 方法来测试子字符串。

arr.filter(x => x.title.includes(searchStr));

【讨论】:

    【解决方案3】:

    您可以检查 indexOf 并添加 toLowerCase() 方法以增加匹配的可能性

    myArr.filter(function(x) { 
        return x.title.toLowerCase().indexOf(searchString.toLowerCase()) > -1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 2020-02-02
      • 2013-08-05
      • 2019-07-18
      • 2022-08-10
      相关资源
      最近更新 更多