例如下面这个稍微复杂一点的数组 [ { IceCream: ['mint', 'chocolate'], Fruit: 'banana' }, { IceCream: ['candy', 'brownie'], Fruit: 'apple' }, { IceCream: ['cake', 'strawberry'], Fruit: 'orange' } ] 假设有几个需求: 1. 查找 IceCream 中包含 'ca' 的项 2. 查找 Fruit 以 'app' 开头的项 3. 查找 IceCream 中完全匹配 'mint' 的项 如果自己写代码实现的话,会麻烦一些,可以使用 match-sorter 这个插件完成这类的数组搜索工作 match-sorter 可以方便的实现对复杂数组的搜索,并对搜索结果按照匹配度进行排序 基本用法 先用一个简单的数组了解 match-sorter 的用法 const list = ['hi', 'hey', 'hello', 'sup', 'yo'] matchSorter ( list, 'y' ) 使用 matchSorter 对数组 list 进行查找,找包含 'y' 的项 结果: ['yo', 'hey'] 这个结果是经过排序的,原数组中 'hey' 在 'yo' 的前面,但查找 'y' 时,'yo' 的匹配度更高,因为他的第一个字符就是 'y',所以排在了前面 示例 先安装,match-sorter 是通过 npm 发布的,使用 npm 在自己的项目目录下安装 npm install --save match-sorter 然后以开头的数组和需求为例 引入包和定义数组 const matchSorter = require('match-sorter')
const foods = [ {IceCream: ['mint', 'chocolate'], Fruit: 'banana'}, {IceCream: ['candy', 'brownie'], Fruit: 'apple'}, {IceCream: ['cake', 'strawberry'], Fruit: 'orange'} ]; 1)查找 IceCream 中包含 'ca' 的项 var result = matchSorter(foods, 'ca', {keys: ['IceCream']}); console.log(result); 执行结果 [ { IceCream: [ 'candy', 'brownie' ], Fruit: 'apple' }, { IceCream: [ 'cake', 'strawberry' ], Fruit: 'orange' }, { IceCream: [ 'mint', 'chocolate' ], Fruit: 'banana' } ] 参数中的 keys 指定了要查找的项,是个数组,可以指定多项,例如 keys: ['IceCream', 'Fruit']
2)查找 Fruit 以 'app' 开头的项 var result = matchSorter(foods, 'app', {
keys: ['Fruit'], threshold: matchSorter.rankings.STARTS_WITH
}); console.log(result); 执行结果 [ { IceCream: [ 'candy', 'brownie' ], Fruit: 'apple' } ] 这里除了 keys 还增加了 threshold,他用来指定匹配的类型 matchSorter.rankings.STARTS_WITH 是查找以给定值为开头的项
3)查找 IceCream 中完全匹配 'mint' 的项 需求1中不是精确匹配,只要包含 c 和 a 就可以 现在需要完全匹配 'mint' var result = matchSorter(foods, 'mint', {
keys: ['IceCream'], threshold: matchSorter.rankings.EQUALS
}); console.log(result); keys 指定对 IceCream 搜索 threshold 的 EQUALS 指定使用完全匹配的方式 执行结果 [ { IceCream: [ 'mint', 'chocolate' ], Fruit: 'banana' } ]
4)嵌套 Key 看一个对象嵌套的情况,例如 const nestedObjList = [ {name: {first: 'Janice'}}, {name: {first: 'Fred'}}, {name: {first: 'George'}}, {name: {first: 'Jen'}}, ] 想查找 first 中包含 'j' 的,用法: matchSorter(nestedObjList, 'j', {keys: ['name.first']}) 匹配模式 上面用到了 EQUALS 和 STARTS_WITH,还有几个其他匹配模式 WORD_STARTS_WITH 如果某项的值是多个单词,只要其中一个词是以给定字符串开头的,就匹配成功 例如 'Sou' 匹配 'South Korea' 或者 'Earth South' 如果使用 STARTS_WITH,则只会匹配 'South Korea' CONTAINS 包含给定值时匹配成功,例如 'ham' 匹配 'Bahamas' ACRONYM 匹配首字母,例如 'us' 匹配 'United States' match-sorter 在大数组匹配上很方便,有此需求时可以仔细了解下 项目地址: https://github.com/kentcdodds/match-sorter