结合使用filter()和includes()来获得部分匹配

ero*_*msr 2 javascript arrays ecmascript-6 lodash

我有一个包含我想要搜索的对象的数组。可搜索数组如下所示:

[
    { value: 0, label: 'john' },
    { value: 1, label: 'johnny' },
    { value: 2, label: 'peter' },
    { value: 3, label: 'peterson' }
]
Run Code Online (Sandbox Code Playgroud)

我使用 Lodash 过滤器方法对此进行搜索:

search = (text) => {
    let results = _.filter(
        this.props.options,
        { label: text }
    );
}
Run Code Online (Sandbox Code Playgroud)

这仅显示与搜索查询(参数)完全匹配的结果text。我需要通过部分匹配来完成这项工作。因此,如果我插入jor ,johnny它应该能够找到“John”和“Johnny”。

我努力了:

search = (text) => {
    let results = _.filter(
        this.props.options => 
            this.props.options.includes({ label: text })
    );
}
Run Code Online (Sandbox Code Playgroud)

但是,没有运气。没有错误,也没有结果。我怎样才能做到这一点?

dhi*_*ilt 6

由于您使用的includes是 ES6 标准的一部分,那么我将使用 ES6 Array.prototype.filter而不是 lodash-filter 来解决此任务:

let search = (list, text) =>
  list.filter(i => i.label.toLowerCase().includes(text.toLowerCase()));

let list = [
    { value: 0, label: 'john' },
    { value: 1, label: 'johnny' },
    { value: 2, label: 'peter' },
    { value: 3, label: 'peterson' }
];

let result = search(list, 'j');

console.log(result); // [{value: 0, label: "john"}, {value: 1, label: "johnny"}]
Run Code Online (Sandbox Code Playgroud)

另外,.toLowerCase您可以使用“John”而不是“john”。